<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>Voro++: cell.cc Source File</title>

<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />



</head>
<body>
<div id="top"><!-- do not remove this div! -->


<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  
  
  <td style="padding-left: 0.5em;">
   <div id="projectname">Voro++
   
   </div>
   
  </td>
  
  
  
 </tr>
 </tbody>
</table>
</div>

<!-- Generated by Doxygen 1.7.5.1 -->
<script type="text/javascript" src="dynsections.js"></script>
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
    </ul>
  </div>
  <div id="navrow2" class="tabs2">
    <ul class="tablist">
      <li><a href="files.html"><span>File&#160;List</span></a></li>
      <li><a href="globals.html"><span>Globals</span></a></li>
    </ul>
  </div>
<div class="header">
  <div class="headertitle">
<div class="title">cell.cc</div>  </div>
</div>
<div class="contents">
<a href="cell_8cc.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">// Voro++, a 3D cell-based Voronoi library</span>
<a name="l00002"></a>00002 <span class="comment">//</span>
<a name="l00003"></a>00003 <span class="comment">// Author   : Chris H. Rycroft (LBL / UC Berkeley)</span>
<a name="l00004"></a>00004 <span class="comment">// Email    : chr@alum.mit.edu</span>
<a name="l00005"></a>00005 <span class="comment">// Date     : August 30th 2011</span>
<a name="l00006"></a>00006 <span class="comment"></span>
<a name="l00007"></a>00007 <span class="comment">/** \file cell.cc</span>
<a name="l00008"></a>00008 <span class="comment"> * \brief Function implementations for the voronoicell and related classes. */</span>
<a name="l00009"></a>00009 
<a name="l00010"></a>00010 <span class="preprocessor">#include &lt;cstring&gt;</span>
<a name="l00011"></a>00011 <span class="keyword">using namespace </span>std;
<a name="l00012"></a>00012 
<a name="l00013"></a>00013 <span class="preprocessor">#include &quot;<a class="code" href="config_8hh.html" title="Master configuration file for setting various compile-time options.">config.hh</a>&quot;</span>
<a name="l00014"></a>00014 <span class="preprocessor">#include &quot;<a class="code" href="common_8hh.html" title="Header file for the small helper functions.">common.hh</a>&quot;</span>
<a name="l00015"></a>00015 <span class="preprocessor">#include &quot;<a class="code" href="cell_8hh.html" title="Header file for the voronoicell and related classes.">cell.hh</a>&quot;</span>
<a name="l00016"></a>00016 
<a name="l00017"></a>00017 <span class="keyword">namespace </span>voro {
<a name="l00018"></a>00018 <span class="comment"></span>
<a name="l00019"></a>00019 <span class="comment">/** Constructs a Voronoi cell and sets up the initial memory. */</span>
<a name="l00020"></a><a class="code" href="classvoro_1_1voronoicell__base.html#a83d13bf519c98bf0ea5804763ffc967d">00020</a> voronoicell_base::voronoicell_base() :
<a name="l00021"></a>00021         current_vertices(init_vertices), current_vertex_order(init_vertex_order),
<a name="l00022"></a>00022         current_delete_size(init_delete_size), current_delete2_size(init_delete2_size),
<a name="l00023"></a>00023         ed(new int*[current_vertices]), nu(new int[current_vertices]),
<a name="l00024"></a>00024         pts(new double[3*current_vertices]), mem(new int[current_vertex_order]),
<a name="l00025"></a>00025         mec(new int[current_vertex_order]), mep(new int*[current_vertex_order]),
<a name="l00026"></a>00026         ds(new int[current_delete_size]), stacke(ds+current_delete_size),
<a name="l00027"></a>00027         ds2(new int[current_delete2_size]), stacke2(ds2+current_delete_size),
<a name="l00028"></a>00028         current_marginal(init_marginal), marg(new int[current_marginal]) {
<a name="l00029"></a>00029         <span class="keywordtype">int</span> i;
<a name="l00030"></a>00030         <span class="keywordflow">for</span>(i=0;i&lt;3;i++) {
<a name="l00031"></a>00031                 <a class="code" href="classvoro_1_1voronoicell__base.html#aafad86ca11af64de2788637b466479f6">mem</a>[i]=init_n_vertices;<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[i]=0;
<a name="l00032"></a>00032                 <a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[i]=<span class="keyword">new</span> <span class="keywordtype">int</span>[init_n_vertices*((i&lt;&lt;1)+1)];
<a name="l00033"></a>00033         }
<a name="l00034"></a>00034         <a class="code" href="classvoro_1_1voronoicell__base.html#aafad86ca11af64de2788637b466479f6">mem</a>[3]=init_3_vertices;<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[3]=0;
<a name="l00035"></a>00035         <a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[3]=<span class="keyword">new</span> <span class="keywordtype">int</span>[init_3_vertices*7];
<a name="l00036"></a>00036         <span class="keywordflow">for</span>(i=4;i&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a14c97918200da778388673728da29274">current_vertex_order</a>;i++) {
<a name="l00037"></a>00037                 <a class="code" href="classvoro_1_1voronoicell__base.html#aafad86ca11af64de2788637b466479f6">mem</a>[i]=init_n_vertices;<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[i]=0;
<a name="l00038"></a>00038                 <a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[i]=<span class="keyword">new</span> <span class="keywordtype">int</span>[init_n_vertices*((i&lt;&lt;1)+1)];
<a name="l00039"></a>00039         }
<a name="l00040"></a>00040 }
<a name="l00041"></a>00041 <span class="comment"></span>
<a name="l00042"></a>00042 <span class="comment">/** The voronoicell destructor deallocates all the dynamic memory. */</span>
<a name="l00043"></a><a class="code" href="classvoro_1_1voronoicell__base.html#ac959634a1ae2e3201e96624f44e7e71e">00043</a> <a class="code" href="classvoro_1_1voronoicell__base.html#ac959634a1ae2e3201e96624f44e7e71e">voronoicell_base::~voronoicell_base</a>() {
<a name="l00044"></a>00044         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=<a class="code" href="classvoro_1_1voronoicell__base.html#a14c97918200da778388673728da29274">current_vertex_order</a>-1;i&gt;=0;i--) <span class="keywordflow">if</span>(<a class="code" href="classvoro_1_1voronoicell__base.html#aafad86ca11af64de2788637b466479f6">mem</a>[i]&gt;0) <span class="keyword">delete</span> [] <a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[i];
<a name="l00045"></a>00045         <span class="keyword">delete</span> [] marg;
<a name="l00046"></a>00046         <span class="keyword">delete</span> [] ds2;<span class="keyword">delete</span> [] ds;
<a name="l00047"></a>00047         <span class="keyword">delete</span> [] <a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>;<span class="keyword">delete</span> [] <a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>;
<a name="l00048"></a>00048         <span class="keyword">delete</span> [] <a class="code" href="classvoro_1_1voronoicell__base.html#aafad86ca11af64de2788637b466479f6">mem</a>;<span class="keyword">delete</span> [] <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>;
<a name="l00049"></a>00049         <span class="keyword">delete</span> [] <a class="code" href="classvoro_1_1voronoicell__base.html#abc7ec6777725e0ddffbbe2ecbe81c6a1">nu</a>;<span class="keyword">delete</span> [] <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>;
<a name="l00050"></a>00050 }
<a name="l00051"></a>00051 <span class="comment"></span>
<a name="l00052"></a>00052 <span class="comment">/** Ensures that enough memory is allocated prior to carrying out a copy.</span>
<a name="l00053"></a>00053 <span class="comment"> * \param[in] vc a reference to the specialized version of the calling class.</span>
<a name="l00054"></a>00054 <span class="comment"> * \param[in] vb a pointered to the class to be copied. */</span>
<a name="l00055"></a>00055 <span class="keyword">template</span>&lt;<span class="keyword">class</span> vc_<span class="keyword">class</span>&gt;
<a name="l00056"></a><a class="code" href="classvoro_1_1voronoicell__base.html#af2c9d916f946ba8d9c7e4c0a7e65215b">00056</a> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__base.html#af2c9d916f946ba8d9c7e4c0a7e65215b">voronoicell_base::check_memory_for_copy</a>(vc_class &amp;vc,<a class="code" href="classvoro_1_1voronoicell__base.html" title="A class representing a single Voronoi cell.">voronoicell_base</a>* vb) {
<a name="l00057"></a>00057         <span class="keywordflow">while</span>(current_vertex_order&lt;vb-&gt;<a class="code" href="classvoro_1_1voronoicell__base.html#a14c97918200da778388673728da29274">current_vertex_order</a>) add_memory_vorder(vc);
<a name="l00058"></a>00058         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a14c97918200da778388673728da29274">current_vertex_order</a>;i++) <span class="keywordflow">while</span>(<a class="code" href="classvoro_1_1voronoicell__base.html#aafad86ca11af64de2788637b466479f6">mem</a>[i]&lt;vb-&gt;<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[i]) add_memory(vc,i,ds2);
<a name="l00059"></a>00059         <span class="keywordflow">while</span>(current_vertices&lt;vb-&gt;<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>) add_memory_vertices(vc);
<a name="l00060"></a>00060 }
<a name="l00061"></a>00061 <span class="comment"></span>
<a name="l00062"></a>00062 <span class="comment">/** Copies the vertex and edge information from another class. The routine</span>
<a name="l00063"></a>00063 <span class="comment"> * assumes that enough memory is available for the copy.</span>
<a name="l00064"></a>00064 <span class="comment"> * \param[in] vb a pointer to the class to copy. */</span>
<a name="l00065"></a><a class="code" href="classvoro_1_1voronoicell__base.html#a47d450e9b9be0fab103f401ddcaeefac">00065</a> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__base.html#a47d450e9b9be0fab103f401ddcaeefac">voronoicell_base::copy</a>(<a class="code" href="classvoro_1_1voronoicell__base.html" title="A class representing a single Voronoi cell.">voronoicell_base</a>* vb) {
<a name="l00066"></a>00066         <span class="keywordtype">int</span> i,j;
<a name="l00067"></a>00067         <a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>=vb-&gt;<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>=0;
<a name="l00068"></a>00068         <span class="keywordflow">for</span>(i=0;i&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a14c97918200da778388673728da29274">current_vertex_order</a>;i++) {
<a name="l00069"></a>00069                 <a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[i]=vb-&gt;<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[i];
<a name="l00070"></a>00070                 <span class="keywordflow">for</span>(j=0;j&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[i]*(2*i+1);j++) <a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[i][j]=vb-&gt;<a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[i][j];
<a name="l00071"></a>00071                 <span class="keywordflow">for</span>(j=0;j&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[i]*(2*i+1);j+=2*i+1) <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[i][j+2*i]]=<a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[i]+j;
<a name="l00072"></a>00072         }
<a name="l00073"></a>00073         <span class="keywordflow">for</span>(i=0;i&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;i++) <a class="code" href="classvoro_1_1voronoicell__base.html#abc7ec6777725e0ddffbbe2ecbe81c6a1">nu</a>[i]=vb-&gt;<a class="code" href="classvoro_1_1voronoicell__base.html#abc7ec6777725e0ddffbbe2ecbe81c6a1">nu</a>[i];
<a name="l00074"></a>00074         <span class="keywordflow">for</span>(i=0;i&lt;3*p;i++) <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[i]=vb-&gt;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[i];
<a name="l00075"></a>00075 }
<a name="l00076"></a>00076 <span class="comment"></span>
<a name="l00077"></a>00077 <span class="comment">/** Copies the information from another voronoicell class into this</span>
<a name="l00078"></a>00078 <span class="comment"> * class, extending memory allocation if necessary.</span>
<a name="l00079"></a>00079 <span class="comment"> * \param[in] c the class to copy. */</span>
<a name="l00080"></a><a class="code" href="classvoro_1_1voronoicell__neighbor.html#ac6036ae44845e301da1e3656e0e98403">00080</a> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__neighbor.html#ac6036ae44845e301da1e3656e0e98403">voronoicell_neighbor::operator=</a>(<a class="code" href="classvoro_1_1voronoicell.html" title="Extension of the voronoicell_base class to represent a Voronoi cell without neighbor information...">voronoicell</a> &amp;c) {
<a name="l00081"></a>00081         <a class="code" href="classvoro_1_1voronoicell__base.html" title="A class representing a single Voronoi cell.">voronoicell_base</a> *vb=((<a class="code" href="classvoro_1_1voronoicell__base.html" title="A class representing a single Voronoi cell.">voronoicell_base</a>*) &amp;c);
<a name="l00082"></a>00082         <a class="code" href="classvoro_1_1voronoicell__base.html#af2c9d916f946ba8d9c7e4c0a7e65215b">check_memory_for_copy</a>(*<span class="keyword">this</span>,vb);<a class="code" href="classvoro_1_1voronoicell__base.html#a47d450e9b9be0fab103f401ddcaeefac">copy</a>(vb);
<a name="l00083"></a>00083         <span class="keywordtype">int</span> i,j;
<a name="l00084"></a>00084         <span class="keywordflow">for</span>(i=0;i&lt;c.<a class="code" href="classvoro_1_1voronoicell__base.html#a14c97918200da778388673728da29274">current_vertex_order</a>;i++) {
<a name="l00085"></a>00085                 <span class="keywordflow">for</span>(j=0;j&lt;c.<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[i]*i;j++) <a class="code" href="classvoro_1_1voronoicell__neighbor.html#aaa1c991b6f5af826bac0f4c7d5f6bf5c">mne</a>[i][j]=0;
<a name="l00086"></a>00086                 <span class="keywordflow">for</span>(j=0;j&lt;c.<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[i];j++) <a class="code" href="classvoro_1_1voronoicell__neighbor.html#a7c061d08eac012b23588032779603a19">ne</a>[c.<a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[i][(2*i+1)*j+2*i]]=<a class="code" href="classvoro_1_1voronoicell__neighbor.html#aaa1c991b6f5af826bac0f4c7d5f6bf5c">mne</a>[i]+(j*i);
<a name="l00087"></a>00087         }
<a name="l00088"></a>00088 }
<a name="l00089"></a>00089 <span class="comment"></span>
<a name="l00090"></a>00090 <span class="comment">/** Copies the information from another voronoicell_neighbor class into this</span>
<a name="l00091"></a>00091 <span class="comment"> * class, extending memory allocation if necessary.</span>
<a name="l00092"></a>00092 <span class="comment"> * \param[in] c the class to copy. */</span>
<a name="l00093"></a><a class="code" href="classvoro_1_1voronoicell__neighbor.html#a0754fe4a44916b68bf3cda3d129b3a69">00093</a> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__neighbor.html#ac6036ae44845e301da1e3656e0e98403">voronoicell_neighbor::operator=</a>(<a class="code" href="classvoro_1_1voronoicell__neighbor.html" title="Extension of the voronoicell_base class to represent a Voronoi cell with neighbor information...">voronoicell_neighbor</a> &amp;c) {
<a name="l00094"></a>00094         <a class="code" href="classvoro_1_1voronoicell__base.html" title="A class representing a single Voronoi cell.">voronoicell_base</a> *vb=((<a class="code" href="classvoro_1_1voronoicell__base.html" title="A class representing a single Voronoi cell.">voronoicell_base</a>*) &amp;c);
<a name="l00095"></a>00095         <a class="code" href="classvoro_1_1voronoicell__base.html#af2c9d916f946ba8d9c7e4c0a7e65215b">check_memory_for_copy</a>(*<span class="keyword">this</span>,vb);<a class="code" href="classvoro_1_1voronoicell__base.html#a47d450e9b9be0fab103f401ddcaeefac">copy</a>(vb);
<a name="l00096"></a>00096         <span class="keywordtype">int</span> i,j;
<a name="l00097"></a>00097         <span class="keywordflow">for</span>(i=0;i&lt;c.<a class="code" href="classvoro_1_1voronoicell__base.html#a14c97918200da778388673728da29274">current_vertex_order</a>;i++) {
<a name="l00098"></a>00098                 <span class="keywordflow">for</span>(j=0;j&lt;c.<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[i]*i;j++) <a class="code" href="classvoro_1_1voronoicell__neighbor.html#aaa1c991b6f5af826bac0f4c7d5f6bf5c">mne</a>[i][j]=c.<a class="code" href="classvoro_1_1voronoicell__neighbor.html#aaa1c991b6f5af826bac0f4c7d5f6bf5c">mne</a>[i][j];
<a name="l00099"></a>00099                 <span class="keywordflow">for</span>(j=0;j&lt;c.<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[i];j++) <a class="code" href="classvoro_1_1voronoicell__neighbor.html#a7c061d08eac012b23588032779603a19">ne</a>[c.<a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[i][(2*i+1)*j+2*i]]=<a class="code" href="classvoro_1_1voronoicell__neighbor.html#aaa1c991b6f5af826bac0f4c7d5f6bf5c">mne</a>[i]+(j*i);
<a name="l00100"></a>00100         }
<a name="l00101"></a>00101 }
<a name="l00102"></a>00102 <span class="comment"></span>
<a name="l00103"></a>00103 <span class="comment">/** Translates the vertices of the Voronoi cell by a given vector.</span>
<a name="l00104"></a>00104 <span class="comment"> * \param[in] (x,y,z) the coordinates of the vector. */</span>
<a name="l00105"></a><a class="code" href="classvoro_1_1voronoicell__base.html#ab2c8534b380907975eb60f3441d50e1e">00105</a> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__base.html#ab2c8534b380907975eb60f3441d50e1e">voronoicell_base::translate</a>(<span class="keywordtype">double</span> x,<span class="keywordtype">double</span> y,<span class="keywordtype">double</span> z) {
<a name="l00106"></a>00106         x*=2;y*=2;z*=2;
<a name="l00107"></a>00107         <span class="keywordtype">double</span> *ptsp=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>;
<a name="l00108"></a>00108         <span class="keywordflow">while</span>(ptsp&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>+3*<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>) {
<a name="l00109"></a>00109                 *(ptsp++)=x;*(ptsp++)=y;*(ptsp++)=z;
<a name="l00110"></a>00110         }
<a name="l00111"></a>00111 }
<a name="l00112"></a>00112 <span class="comment"></span>
<a name="l00113"></a>00113 <span class="comment">/** Increases the memory storage for a particular vertex order, by increasing</span>
<a name="l00114"></a>00114 <span class="comment"> * the size of the of the corresponding mep array. If the arrays already exist,</span>
<a name="l00115"></a>00115 <span class="comment"> * their size is doubled; if they don&#39;t exist, then new ones of size</span>
<a name="l00116"></a>00116 <span class="comment"> * init_n_vertices are allocated. The routine also ensures that the pointers in</span>
<a name="l00117"></a>00117 <span class="comment"> * the ed array are updated, by making use of the back pointers. For the cases</span>
<a name="l00118"></a>00118 <span class="comment"> * where the back pointer has been temporarily overwritten in the marginal</span>
<a name="l00119"></a>00119 <span class="comment"> * vertex code, the auxiliary delete stack is scanned to find out how to update</span>
<a name="l00120"></a>00120 <span class="comment"> * the ed value. If the template has been instantiated with the neighbor</span>
<a name="l00121"></a>00121 <span class="comment"> * tracking turned on, then the routine also reallocates the corresponding mne</span>
<a name="l00122"></a>00122 <span class="comment"> * array.</span>
<a name="l00123"></a>00123 <span class="comment"> * \param[in] i the order of the vertex memory to be increased. */</span>
<a name="l00124"></a>00124 <span class="keyword">template</span>&lt;<span class="keyword">class</span> vc_<span class="keyword">class</span>&gt;
<a name="l00125"></a>00125 <span class="keywordtype">void</span> voronoicell_base::add_memory(vc_class &amp;vc,<span class="keywordtype">int</span> i,<span class="keywordtype">int</span> *stackp2) {
<a name="l00126"></a>00126         <span class="keywordtype">int</span> s=(i&lt;&lt;1)+1;
<a name="l00127"></a>00127         <span class="keywordflow">if</span>(<a class="code" href="classvoro_1_1voronoicell__base.html#aafad86ca11af64de2788637b466479f6">mem</a>[i]==0) {
<a name="l00128"></a>00128                 vc.n_allocate(i,init_n_vertices);
<a name="l00129"></a>00129                 <a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[i]=<span class="keyword">new</span> <span class="keywordtype">int</span>[init_n_vertices*s];
<a name="l00130"></a>00130                 <a class="code" href="classvoro_1_1voronoicell__base.html#aafad86ca11af64de2788637b466479f6">mem</a>[i]=init_n_vertices;
<a name="l00131"></a>00131 <span class="preprocessor">#if VOROPP_VERBOSE &gt;=2</span>
<a name="l00132"></a>00132 <span class="preprocessor"></span>                fprintf(stderr,<span class="stringliteral">&quot;Order %d vertex memory created\n&quot;</span>,i);
<a name="l00133"></a>00133 <span class="preprocessor">#endif</span>
<a name="l00134"></a>00134 <span class="preprocessor"></span>        } <span class="keywordflow">else</span> {
<a name="l00135"></a>00135                 <span class="keywordtype">int</span> j=0,k,*l;
<a name="l00136"></a>00136                 <a class="code" href="classvoro_1_1voronoicell__base.html#aafad86ca11af64de2788637b466479f6">mem</a>[i]&lt;&lt;=1;
<a name="l00137"></a>00137                 <span class="keywordflow">if</span>(<a class="code" href="classvoro_1_1voronoicell__base.html#aafad86ca11af64de2788637b466479f6">mem</a>[i]&gt;max_n_vertices) voro_fatal_error(<span class="stringliteral">&quot;Point memory allocation exceeded absolute maximum&quot;</span>,<a class="code" href="config_8hh.html#a5dc0616f8a67ae3d1c2ba8a3dcf5612b">VOROPP_MEMORY_ERROR</a>);
<a name="l00138"></a>00138 <span class="preprocessor">#if VOROPP_VERBOSE &gt;=2</span>
<a name="l00139"></a>00139 <span class="preprocessor"></span>                fprintf(stderr,<span class="stringliteral">&quot;Order %d vertex memory scaled up to %d\n&quot;</span>,i,<a class="code" href="classvoro_1_1voronoicell__base.html#aafad86ca11af64de2788637b466479f6">mem</a>[i]);
<a name="l00140"></a>00140 <span class="preprocessor">#endif</span>
<a name="l00141"></a>00141 <span class="preprocessor"></span>                l=<span class="keyword">new</span> <span class="keywordtype">int</span>[s*<a class="code" href="classvoro_1_1voronoicell__base.html#aafad86ca11af64de2788637b466479f6">mem</a>[i]];
<a name="l00142"></a>00142                 <span class="keywordtype">int</span> m=0;
<a name="l00143"></a>00143                 vc.n_allocate_aux1(i);
<a name="l00144"></a>00144                 <span class="keywordflow">while</span>(j&lt;s*<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[i]) {
<a name="l00145"></a>00145                         k=<a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[i][j+(i&lt;&lt;1)];
<a name="l00146"></a>00146                         <span class="keywordflow">if</span>(k&gt;=0) {
<a name="l00147"></a>00147                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k]=l+j;
<a name="l00148"></a>00148                                 vc.n_set_to_aux1_offset(k,m);
<a name="l00149"></a>00149                         } <span class="keywordflow">else</span> {
<a name="l00150"></a>00150                                 <span class="keywordtype">int</span> *dsp;
<a name="l00151"></a>00151                                 <span class="keywordflow">for</span>(dsp=ds2;dsp&lt;stackp2;dsp++) {
<a name="l00152"></a>00152                                         <span class="keywordflow">if</span>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[*dsp]==<a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[i]+j) {
<a name="l00153"></a>00153                                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[*dsp]=l+j;
<a name="l00154"></a>00154                                                 vc.n_set_to_aux1_offset(*dsp,m);
<a name="l00155"></a>00155                                                 <span class="keywordflow">break</span>;
<a name="l00156"></a>00156                                         }
<a name="l00157"></a>00157                                 }
<a name="l00158"></a>00158                                 <span class="keywordflow">if</span>(dsp==stackp2) voro_fatal_error(<span class="stringliteral">&quot;Couldn&#39;t relocate dangling pointer&quot;</span>,<a class="code" href="config_8hh.html#ad8e0de9d48da06e86dd87884e4a2d47e">VOROPP_INTERNAL_ERROR</a>);
<a name="l00159"></a>00159 <span class="preprocessor">#if VOROPP_VERBOSE &gt;=3</span>
<a name="l00160"></a>00160 <span class="preprocessor"></span>                                fputs(<span class="stringliteral">&quot;Relocated dangling pointer&quot;</span>,stderr);
<a name="l00161"></a>00161 <span class="preprocessor">#endif</span>
<a name="l00162"></a>00162 <span class="preprocessor"></span>                        }
<a name="l00163"></a>00163                         <span class="keywordflow">for</span>(k=0;k&lt;s;k++,j++) l[j]=<a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[i][j];
<a name="l00164"></a>00164                         <span class="keywordflow">for</span>(k=0;k&lt;i;k++,m++) vc.n_copy_to_aux1(i,m);
<a name="l00165"></a>00165                 }
<a name="l00166"></a>00166                 <span class="keyword">delete</span> [] <a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[i];
<a name="l00167"></a>00167                 <a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[i]=l;
<a name="l00168"></a>00168                 vc.n_switch_to_aux1(i);
<a name="l00169"></a>00169         }
<a name="l00170"></a>00170 }
<a name="l00171"></a>00171 <span class="comment"></span>
<a name="l00172"></a>00172 <span class="comment">/** Doubles the maximum number of vertices allowed, by reallocating the ed, nu,</span>
<a name="l00173"></a>00173 <span class="comment"> * and pts arrays. If the allocation exceeds the absolute maximum set in</span>
<a name="l00174"></a>00174 <span class="comment"> * max_vertices, then the routine exits with a fatal error. If the template has</span>
<a name="l00175"></a>00175 <span class="comment"> * been instantiated with the neighbor tracking turned on, then the routine</span>
<a name="l00176"></a>00176 <span class="comment"> * also reallocates the ne array. */</span>
<a name="l00177"></a>00177 <span class="keyword">template</span>&lt;<span class="keyword">class</span> vc_<span class="keyword">class</span>&gt;
<a name="l00178"></a>00178 <span class="keywordtype">void</span> voronoicell_base::add_memory_vertices(vc_class &amp;vc) {
<a name="l00179"></a>00179         <span class="keywordtype">int</span> i=(<a class="code" href="classvoro_1_1voronoicell__base.html#ab0b624e4e72fca14c99bf1c41c430614">current_vertices</a>&lt;&lt;1),j,**pp,*pnu;
<a name="l00180"></a>00180         <span class="keywordflow">if</span>(i&gt;max_vertices) voro_fatal_error(<span class="stringliteral">&quot;Vertex memory allocation exceeded absolute maximum&quot;</span>,<a class="code" href="config_8hh.html#a5dc0616f8a67ae3d1c2ba8a3dcf5612b">VOROPP_MEMORY_ERROR</a>);
<a name="l00181"></a>00181 <span class="preprocessor">#if VOROPP_VERBOSE &gt;=2</span>
<a name="l00182"></a>00182 <span class="preprocessor"></span>        fprintf(stderr,<span class="stringliteral">&quot;Vertex memory scaled up to %d\n&quot;</span>,i);
<a name="l00183"></a>00183 <span class="preprocessor">#endif</span>
<a name="l00184"></a>00184 <span class="preprocessor"></span>        <span class="keywordtype">double</span> *ppts;
<a name="l00185"></a>00185         pp=<span class="keyword">new</span> <span class="keywordtype">int</span>*[i];
<a name="l00186"></a>00186         <span class="keywordflow">for</span>(j=0;j&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#ab0b624e4e72fca14c99bf1c41c430614">current_vertices</a>;j++) pp[j]=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[j];
<a name="l00187"></a>00187         <span class="keyword">delete</span> [] <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>;<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>=pp;
<a name="l00188"></a>00188         vc.n_add_memory_vertices(i);
<a name="l00189"></a>00189         pnu=<span class="keyword">new</span> <span class="keywordtype">int</span>[i];
<a name="l00190"></a>00190         <span class="keywordflow">for</span>(j=0;j&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#ab0b624e4e72fca14c99bf1c41c430614">current_vertices</a>;j++) pnu[j]=<a class="code" href="classvoro_1_1voronoicell__base.html#abc7ec6777725e0ddffbbe2ecbe81c6a1">nu</a>[j];
<a name="l00191"></a>00191         <span class="keyword">delete</span> [] <a class="code" href="classvoro_1_1voronoicell__base.html#abc7ec6777725e0ddffbbe2ecbe81c6a1">nu</a>;<a class="code" href="classvoro_1_1voronoicell__base.html#abc7ec6777725e0ddffbbe2ecbe81c6a1">nu</a>=pnu;
<a name="l00192"></a>00192         ppts=<span class="keyword">new</span> <span class="keywordtype">double</span>[3*i];
<a name="l00193"></a>00193         <span class="keywordflow">for</span>(j=0;j&lt;3*<a class="code" href="classvoro_1_1voronoicell__base.html#ab0b624e4e72fca14c99bf1c41c430614">current_vertices</a>;j++) ppts[j]=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[j];
<a name="l00194"></a>00194         <span class="keyword">delete</span> [] <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>=ppts;
<a name="l00195"></a>00195         current_vertices=i;
<a name="l00196"></a>00196 }
<a name="l00197"></a>00197 <span class="comment"></span>
<a name="l00198"></a>00198 <span class="comment">/** Doubles the maximum allowed vertex order, by reallocating mem, mep, and mec</span>
<a name="l00199"></a>00199 <span class="comment"> * arrays. If the allocation exceeds the absolute maximum set in</span>
<a name="l00200"></a>00200 <span class="comment"> * max_vertex_order, then the routine causes a fatal error. If the template has</span>
<a name="l00201"></a>00201 <span class="comment"> * been instantiated with the neighbor tracking turned on, then the routine</span>
<a name="l00202"></a>00202 <span class="comment"> * also reallocates the mne array. */</span>
<a name="l00203"></a>00203 <span class="keyword">template</span>&lt;<span class="keyword">class</span> vc_<span class="keyword">class</span>&gt;
<a name="l00204"></a>00204 <span class="keywordtype">void</span> voronoicell_base::add_memory_vorder(vc_class &amp;vc) {
<a name="l00205"></a>00205         <span class="keywordtype">int</span> i=(<a class="code" href="classvoro_1_1voronoicell__base.html#a14c97918200da778388673728da29274">current_vertex_order</a>&lt;&lt;1),j,*p1,**p2;
<a name="l00206"></a>00206         <span class="keywordflow">if</span>(i&gt;max_vertex_order) voro_fatal_error(<span class="stringliteral">&quot;Vertex order memory allocation exceeded absolute maximum&quot;</span>,<a class="code" href="config_8hh.html#a5dc0616f8a67ae3d1c2ba8a3dcf5612b">VOROPP_MEMORY_ERROR</a>);
<a name="l00207"></a>00207 <span class="preprocessor">#if VOROPP_VERBOSE &gt;=2</span>
<a name="l00208"></a>00208 <span class="preprocessor"></span>        fprintf(stderr,<span class="stringliteral">&quot;Vertex order memory scaled up to %d\n&quot;</span>,i);
<a name="l00209"></a>00209 <span class="preprocessor">#endif</span>
<a name="l00210"></a>00210 <span class="preprocessor"></span>        p1=<span class="keyword">new</span> <span class="keywordtype">int</span>[i];
<a name="l00211"></a>00211         <span class="keywordflow">for</span>(j=0;j&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a14c97918200da778388673728da29274">current_vertex_order</a>;j++) p1[j]=mem[j];<span class="keywordflow">while</span>(j&lt;i) p1[j++]=0;
<a name="l00212"></a>00212         <span class="keyword">delete</span> [] <a class="code" href="classvoro_1_1voronoicell__base.html#aafad86ca11af64de2788637b466479f6">mem</a>;mem=p1;
<a name="l00213"></a>00213         p2=<span class="keyword">new</span> <span class="keywordtype">int</span>*[i];
<a name="l00214"></a>00214         <span class="keywordflow">for</span>(j=0;j&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a14c97918200da778388673728da29274">current_vertex_order</a>;j++) p2[j]=<a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[j];
<a name="l00215"></a>00215         <span class="keyword">delete</span> [] <a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>;<a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>=p2;
<a name="l00216"></a>00216         p1=<span class="keyword">new</span> <span class="keywordtype">int</span>[i];
<a name="l00217"></a>00217         <span class="keywordflow">for</span>(j=0;j&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a14c97918200da778388673728da29274">current_vertex_order</a>;j++) p1[j]=<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[j];<span class="keywordflow">while</span>(j&lt;i) p1[j++]=0;
<a name="l00218"></a>00218         <span class="keyword">delete</span> [] <a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>;<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>=p1;
<a name="l00219"></a>00219         vc.n_add_memory_vorder(i);
<a name="l00220"></a>00220         current_vertex_order=i;
<a name="l00221"></a>00221 }
<a name="l00222"></a>00222 <span class="comment"></span>
<a name="l00223"></a>00223 <span class="comment">/** Doubles the size allocation of the main delete stack. If the allocation</span>
<a name="l00224"></a>00224 <span class="comment"> * exceeds the absolute maximum set in max_delete_size, then routine causes a</span>
<a name="l00225"></a>00225 <span class="comment"> * fatal error. */</span>
<a name="l00226"></a>00226 <span class="keywordtype">void</span> voronoicell_base::add_memory_ds(<span class="keywordtype">int</span> *&amp;stackp) {
<a name="l00227"></a>00227         <a class="code" href="classvoro_1_1voronoicell__base.html#a7dbec3b0b6ea24e22e651cf76f06dc04">current_delete_size</a>&lt;&lt;=1;
<a name="l00228"></a>00228         <span class="keywordflow">if</span>(<a class="code" href="classvoro_1_1voronoicell__base.html#a7dbec3b0b6ea24e22e651cf76f06dc04">current_delete_size</a>&gt;max_delete_size) voro_fatal_error(<span class="stringliteral">&quot;Delete stack 1 memory allocation exceeded absolute maximum&quot;</span>,<a class="code" href="config_8hh.html#a5dc0616f8a67ae3d1c2ba8a3dcf5612b">VOROPP_MEMORY_ERROR</a>);
<a name="l00229"></a>00229 <span class="preprocessor">#if VOROPP_VERBOSE &gt;=2</span>
<a name="l00230"></a>00230 <span class="preprocessor"></span>        fprintf(stderr,<span class="stringliteral">&quot;Delete stack 1 memory scaled up to %d\n&quot;</span>,<a class="code" href="classvoro_1_1voronoicell__base.html#a7dbec3b0b6ea24e22e651cf76f06dc04">current_delete_size</a>);
<a name="l00231"></a>00231 <span class="preprocessor">#endif</span>
<a name="l00232"></a>00232 <span class="preprocessor"></span>        <span class="keywordtype">int</span> *dsn=<span class="keyword">new</span> <span class="keywordtype">int</span>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7dbec3b0b6ea24e22e651cf76f06dc04">current_delete_size</a>],*dsnp=dsn,*dsp=ds;
<a name="l00233"></a>00233         <span class="keywordflow">while</span>(dsp&lt;stackp) *(dsnp++)=*(dsp++);
<a name="l00234"></a>00234         <span class="keyword">delete</span> [] ds;ds=dsn;stackp=dsnp;
<a name="l00235"></a>00235         stacke=ds+<a class="code" href="classvoro_1_1voronoicell__base.html#a7dbec3b0b6ea24e22e651cf76f06dc04">current_delete_size</a>;
<a name="l00236"></a>00236 }
<a name="l00237"></a>00237 <span class="comment"></span>
<a name="l00238"></a>00238 <span class="comment">/** Doubles the size allocation of the auxiliary delete stack. If the</span>
<a name="l00239"></a>00239 <span class="comment"> * allocation exceeds the absolute maximum set in max_delete2_size, then the</span>
<a name="l00240"></a>00240 <span class="comment"> * routine causes a fatal error. */</span>
<a name="l00241"></a>00241 <span class="keywordtype">void</span> voronoicell_base::add_memory_ds2(<span class="keywordtype">int</span> *&amp;stackp2) {
<a name="l00242"></a>00242         <a class="code" href="classvoro_1_1voronoicell__base.html#a2a238c710c2e91045ef9deae0faf8dc9">current_delete2_size</a>&lt;&lt;=1;
<a name="l00243"></a>00243         <span class="keywordflow">if</span>(<a class="code" href="classvoro_1_1voronoicell__base.html#a2a238c710c2e91045ef9deae0faf8dc9">current_delete2_size</a>&gt;max_delete2_size) voro_fatal_error(<span class="stringliteral">&quot;Delete stack 2 memory allocation exceeded absolute maximum&quot;</span>,<a class="code" href="config_8hh.html#a5dc0616f8a67ae3d1c2ba8a3dcf5612b">VOROPP_MEMORY_ERROR</a>);
<a name="l00244"></a>00244 <span class="preprocessor">#if VOROPP_VERBOSE &gt;=2</span>
<a name="l00245"></a>00245 <span class="preprocessor"></span>        fprintf(stderr,<span class="stringliteral">&quot;Delete stack 2 memory scaled up to %d\n&quot;</span>,<a class="code" href="classvoro_1_1voronoicell__base.html#a2a238c710c2e91045ef9deae0faf8dc9">current_delete2_size</a>);
<a name="l00246"></a>00246 <span class="preprocessor">#endif</span>
<a name="l00247"></a>00247 <span class="preprocessor"></span>        <span class="keywordtype">int</span> *dsn=<span class="keyword">new</span> <span class="keywordtype">int</span>[<a class="code" href="classvoro_1_1voronoicell__base.html#a2a238c710c2e91045ef9deae0faf8dc9">current_delete2_size</a>],*dsnp=dsn,*dsp=ds2;
<a name="l00248"></a>00248         <span class="keywordflow">while</span>(dsp&lt;stackp2) *(dsnp++)=*(dsp++);
<a name="l00249"></a>00249         <span class="keyword">delete</span> [] ds2;ds2=dsn;stackp2=dsnp;
<a name="l00250"></a>00250         stacke2=ds2+<a class="code" href="classvoro_1_1voronoicell__base.html#a2a238c710c2e91045ef9deae0faf8dc9">current_delete2_size</a>;
<a name="l00251"></a>00251 }
<a name="l00252"></a>00252 <span class="comment"></span>
<a name="l00253"></a>00253 <span class="comment">/** Initializes a Voronoi cell as a rectangular box with the given dimensions.</span>
<a name="l00254"></a>00254 <span class="comment"> * \param[in] (xmin,xmax) the minimum and maximum x coordinates.</span>
<a name="l00255"></a>00255 <span class="comment"> * \param[in] (ymin,ymax) the minimum and maximum y coordinates.</span>
<a name="l00256"></a>00256 <span class="comment"> * \param[in] (zmin,zmax) the minimum and maximum z coordinates. */</span>
<a name="l00257"></a><a class="code" href="classvoro_1_1voronoicell__base.html#a4c7f5406ba3beb1aa0d047592316c68d">00257</a> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__base.html#a4c7f5406ba3beb1aa0d047592316c68d">voronoicell_base::init_base</a>(<span class="keywordtype">double</span> xmin,<span class="keywordtype">double</span> xmax,<span class="keywordtype">double</span> ymin,<span class="keywordtype">double</span> ymax,<span class="keywordtype">double</span> zmin,<span class="keywordtype">double</span> zmax) {
<a name="l00258"></a>00258         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a14c97918200da778388673728da29274">current_vertex_order</a>;i++) <a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[i]=0;<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>=0;
<a name="l00259"></a>00259         <a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[3]=<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>=8;xmin*=2;xmax*=2;ymin*=2;ymax*=2;zmin*=2;zmax*=2;
<a name="l00260"></a>00260         *<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>=xmin;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[1]=ymin;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[2]=zmin;
<a name="l00261"></a>00261         <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3]=xmax;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[4]=ymin;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[5]=zmin;
<a name="l00262"></a>00262         <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[6]=xmin;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[7]=ymax;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[8]=zmin;
<a name="l00263"></a>00263         <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[9]=xmax;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[10]=ymax;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[11]=zmin;
<a name="l00264"></a>00264         <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[12]=xmin;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[13]=ymin;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[14]=zmax;
<a name="l00265"></a>00265         <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[15]=xmax;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[16]=ymin;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[17]=zmax;
<a name="l00266"></a>00266         <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[18]=xmin;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[19]=ymax;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[20]=zmax;
<a name="l00267"></a>00267         <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[21]=xmax;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[22]=ymax;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[23]=zmax;
<a name="l00268"></a>00268         <span class="keywordtype">int</span> *q=<a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[3];
<a name="l00269"></a>00269         *q=1;q[1]=4;q[2]=2;q[3]=2;q[4]=1;q[5]=0;q[6]=0;
<a name="l00270"></a>00270         q[7]=3;q[8]=5;q[9]=0;q[10]=2;q[11]=1;q[12]=0;q[13]=1;
<a name="l00271"></a>00271         q[14]=0;q[15]=6;q[16]=3;q[17]=2;q[18]=1;q[19]=0;q[20]=2;
<a name="l00272"></a>00272         q[21]=2;q[22]=7;q[23]=1;q[24]=2;q[25]=1;q[26]=0;q[27]=3;
<a name="l00273"></a>00273         q[28]=6;q[29]=0;q[30]=5;q[31]=2;q[32]=1;q[33]=0;q[34]=4;
<a name="l00274"></a>00274         q[35]=4;q[36]=1;q[37]=7;q[38]=2;q[39]=1;q[40]=0;q[41]=5;
<a name="l00275"></a>00275         q[42]=7;q[43]=2;q[44]=4;q[45]=2;q[46]=1;q[47]=0;q[48]=6;
<a name="l00276"></a>00276         q[49]=5;q[50]=3;q[51]=6;q[52]=2;q[53]=1;q[54]=0;q[55]=7;
<a name="l00277"></a>00277         *<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>=q;<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[1]=q+7;<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[2]=q+14;<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[3]=q+21;
<a name="l00278"></a>00278         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[4]=q+28;<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[5]=q+35;<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[6]=q+42;<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[7]=q+49;
<a name="l00279"></a>00279         *<a class="code" href="classvoro_1_1voronoicell__base.html#abc7ec6777725e0ddffbbe2ecbe81c6a1">nu</a>=<a class="code" href="classvoro_1_1voronoicell__base.html#abc7ec6777725e0ddffbbe2ecbe81c6a1">nu</a>[1]=<a class="code" href="classvoro_1_1voronoicell__base.html#abc7ec6777725e0ddffbbe2ecbe81c6a1">nu</a>[2]=<a class="code" href="classvoro_1_1voronoicell__base.html#abc7ec6777725e0ddffbbe2ecbe81c6a1">nu</a>[3]=<a class="code" href="classvoro_1_1voronoicell__base.html#abc7ec6777725e0ddffbbe2ecbe81c6a1">nu</a>[4]=<a class="code" href="classvoro_1_1voronoicell__base.html#abc7ec6777725e0ddffbbe2ecbe81c6a1">nu</a>[5]=<a class="code" href="classvoro_1_1voronoicell__base.html#abc7ec6777725e0ddffbbe2ecbe81c6a1">nu</a>[6]=<a class="code" href="classvoro_1_1voronoicell__base.html#abc7ec6777725e0ddffbbe2ecbe81c6a1">nu</a>[7]=3;
<a name="l00280"></a>00280 }
<a name="l00281"></a>00281 <span class="comment"></span>
<a name="l00282"></a>00282 <span class="comment">/** Initializes a Voronoi cell as a regular octahedron.</span>
<a name="l00283"></a>00283 <span class="comment"> * \param[in] l The distance from the octahedron center to a vertex. Six</span>
<a name="l00284"></a>00284 <span class="comment"> *              vertices are initialized at (-l,0,0), (l,0,0), (0,-l,0),</span>
<a name="l00285"></a>00285 <span class="comment"> *              (0,l,0), (0,0,-l), and (0,0,l). */</span>
<a name="l00286"></a><a class="code" href="classvoro_1_1voronoicell__base.html#aab954caa57c67a26c03b0377f5778bb1">00286</a> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__base.html#aab954caa57c67a26c03b0377f5778bb1">voronoicell_base::init_octahedron_base</a>(<span class="keywordtype">double</span> l) {
<a name="l00287"></a>00287         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a14c97918200da778388673728da29274">current_vertex_order</a>;i++) <a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[i]=0;<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>=0;
<a name="l00288"></a>00288         <a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[4]=<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>=6;l*=2;
<a name="l00289"></a>00289         *<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>=-l;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[1]=0;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[2]=0;
<a name="l00290"></a>00290         <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3]=l;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[4]=0;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[5]=0;
<a name="l00291"></a>00291         <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[6]=0;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[7]=-l;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[8]=0;
<a name="l00292"></a>00292         <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[9]=0;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[10]=l;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[11]=0;
<a name="l00293"></a>00293         <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[12]=0;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[13]=0;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[14]=-l;
<a name="l00294"></a>00294         <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[15]=0;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[16]=0;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[17]=l;
<a name="l00295"></a>00295         <span class="keywordtype">int</span> *q=<a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[4];
<a name="l00296"></a>00296         *q=2;q[1]=5;q[2]=3;q[3]=4;q[4]=0;q[5]=0;q[6]=0;q[7]=0;q[8]=0;
<a name="l00297"></a>00297         q[9]=2;q[10]=4;q[11]=3;q[12]=5;q[13]=2;q[14]=2;q[15]=2;q[16]=2;q[17]=1;
<a name="l00298"></a>00298         q[18]=0;q[19]=4;q[20]=1;q[21]=5;q[22]=0;q[23]=3;q[24]=0;q[25]=1;q[26]=2;
<a name="l00299"></a>00299         q[27]=0;q[28]=5;q[29]=1;q[30]=4;q[31]=2;q[32]=3;q[33]=2;q[34]=1;q[35]=3;
<a name="l00300"></a>00300         q[36]=0;q[37]=3;q[38]=1;q[39]=2;q[40]=3;q[41]=3;q[42]=1;q[43]=1;q[44]=4;
<a name="l00301"></a>00301         q[45]=0;q[46]=2;q[47]=1;q[48]=3;q[49]=1;q[50]=3;q[51]=3;q[52]=1;q[53]=5;
<a name="l00302"></a>00302         *<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>=q;<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[1]=q+9;<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[2]=q+18;<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[3]=q+27;<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[4]=q+36;<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[5]=q+45;
<a name="l00303"></a>00303         *<a class="code" href="classvoro_1_1voronoicell__base.html#abc7ec6777725e0ddffbbe2ecbe81c6a1">nu</a>=<a class="code" href="classvoro_1_1voronoicell__base.html#abc7ec6777725e0ddffbbe2ecbe81c6a1">nu</a>[1]=<a class="code" href="classvoro_1_1voronoicell__base.html#abc7ec6777725e0ddffbbe2ecbe81c6a1">nu</a>[2]=<a class="code" href="classvoro_1_1voronoicell__base.html#abc7ec6777725e0ddffbbe2ecbe81c6a1">nu</a>[3]=<a class="code" href="classvoro_1_1voronoicell__base.html#abc7ec6777725e0ddffbbe2ecbe81c6a1">nu</a>[4]=<a class="code" href="classvoro_1_1voronoicell__base.html#abc7ec6777725e0ddffbbe2ecbe81c6a1">nu</a>[5]=4;
<a name="l00304"></a>00304 }
<a name="l00305"></a>00305 <span class="comment"></span>
<a name="l00306"></a>00306 <span class="comment">/** Initializes a Voronoi cell as a tetrahedron. It assumes that the normal to</span>
<a name="l00307"></a>00307 <span class="comment"> * the face for the first three vertices points inside.</span>
<a name="l00308"></a>00308 <span class="comment"> * \param (x0,y0,z0) a position vector for the first vertex.</span>
<a name="l00309"></a>00309 <span class="comment"> * \param (x1,y1,z1) a position vector for the second vertex.</span>
<a name="l00310"></a>00310 <span class="comment"> * \param (x2,y2,z2) a position vector for the third vertex.</span>
<a name="l00311"></a>00311 <span class="comment"> * \param (x3,y3,z3) a position vector for the fourth vertex. */</span>
<a name="l00312"></a><a class="code" href="classvoro_1_1voronoicell__base.html#ae71280e1c36c5f840f870d55e91c027b">00312</a> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__base.html#ae71280e1c36c5f840f870d55e91c027b">voronoicell_base::init_tetrahedron_base</a>(<span class="keywordtype">double</span> x0,<span class="keywordtype">double</span> y0,<span class="keywordtype">double</span> z0,<span class="keywordtype">double</span> x1,<span class="keywordtype">double</span> y1,<span class="keywordtype">double</span> z1,<span class="keywordtype">double</span> x2,<span class="keywordtype">double</span> y2,<span class="keywordtype">double</span> z2,<span class="keywordtype">double</span> x3,<span class="keywordtype">double</span> y3,<span class="keywordtype">double</span> z3) {
<a name="l00313"></a>00313         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a14c97918200da778388673728da29274">current_vertex_order</a>;i++) <a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[i]=0;<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>=0;
<a name="l00314"></a>00314         <a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[3]=<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>=4;
<a name="l00315"></a>00315         *<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>=x0*2;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[1]=y0*2;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[2]=z0*2;
<a name="l00316"></a>00316         <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3]=x1*2;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[4]=y1*2;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[5]=z1*2;
<a name="l00317"></a>00317         <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[6]=x2*2;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[7]=y2*2;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[8]=z2*2;
<a name="l00318"></a>00318         <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[9]=x3*2;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[10]=y3*2;<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[11]=z3*2;
<a name="l00319"></a>00319         <span class="keywordtype">int</span> *q=<a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[3];
<a name="l00320"></a>00320         *q=1;q[1]=3;q[2]=2;q[3]=0;q[4]=0;q[5]=0;q[6]=0;
<a name="l00321"></a>00321         q[7]=0;q[8]=2;q[9]=3;q[10]=0;q[11]=2;q[12]=1;q[13]=1;
<a name="l00322"></a>00322         q[14]=0;q[15]=3;q[16]=1;q[17]=2;q[18]=2;q[19]=1;q[20]=2;
<a name="l00323"></a>00323         q[21]=0;q[22]=1;q[23]=2;q[24]=1;q[25]=2;q[26]=1;q[27]=3;
<a name="l00324"></a>00324         *<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>=q;<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[1]=q+7;<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[2]=q+14;<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[3]=q+21;
<a name="l00325"></a>00325         *<a class="code" href="classvoro_1_1voronoicell__base.html#abc7ec6777725e0ddffbbe2ecbe81c6a1">nu</a>=<a class="code" href="classvoro_1_1voronoicell__base.html#abc7ec6777725e0ddffbbe2ecbe81c6a1">nu</a>[1]=<a class="code" href="classvoro_1_1voronoicell__base.html#abc7ec6777725e0ddffbbe2ecbe81c6a1">nu</a>[2]=<a class="code" href="classvoro_1_1voronoicell__base.html#abc7ec6777725e0ddffbbe2ecbe81c6a1">nu</a>[3]=3;
<a name="l00326"></a>00326 }
<a name="l00327"></a>00327 <span class="comment"></span>
<a name="l00328"></a>00328 <span class="comment">/** Checks that the relational table of the Voronoi cell is accurate, and</span>
<a name="l00329"></a>00329 <span class="comment"> * prints out any errors. This algorithm is O(p), so running it every time the</span>
<a name="l00330"></a>00330 <span class="comment"> * plane routine is called will result in a significant slowdown. */</span>
<a name="l00331"></a><a class="code" href="classvoro_1_1voronoicell__base.html#ae7bb21f644a45946001beef598a1da1f">00331</a> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__base.html#ae7bb21f644a45946001beef598a1da1f">voronoicell_base::check_relations</a>() {
<a name="l00332"></a>00332         <span class="keywordtype">int</span> i,j;
<a name="l00333"></a>00333         <span class="keywordflow">for</span>(i=0;i&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;i++) <span class="keywordflow">for</span>(j=0;j&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#abc7ec6777725e0ddffbbe2ecbe81c6a1">nu</a>[i];j++) <span class="keywordflow">if</span>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j]][<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][nu[i]+j]]!=i)
<a name="l00334"></a>00334                 printf(<span class="stringliteral">&quot;Relational error at point %d, edge %d.\n&quot;</span>,i,j);
<a name="l00335"></a>00335 }
<a name="l00336"></a>00336 <span class="comment"></span>
<a name="l00337"></a>00337 <span class="comment">/** This routine checks for any two vertices that are connected by more than</span>
<a name="l00338"></a>00338 <span class="comment"> * one edge. The plane algorithm is designed so that this should not happen, so</span>
<a name="l00339"></a>00339 <span class="comment"> * any occurrences are most likely errors. Note that the routine is O(p), so</span>
<a name="l00340"></a>00340 <span class="comment"> * running it every time the plane routine is called will result in a</span>
<a name="l00341"></a>00341 <span class="comment"> * significant slowdown. */</span>
<a name="l00342"></a><a class="code" href="classvoro_1_1voronoicell__base.html#a3f6c0b98feb914c324248cd3d3baf43d">00342</a> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__base.html#a3f6c0b98feb914c324248cd3d3baf43d">voronoicell_base::check_duplicates</a>() {
<a name="l00343"></a>00343         <span class="keywordtype">int</span> i,j,k;
<a name="l00344"></a>00344         <span class="keywordflow">for</span>(i=0;i&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;i++) <span class="keywordflow">for</span>(j=1;j&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#abc7ec6777725e0ddffbbe2ecbe81c6a1">nu</a>[i];j++) <span class="keywordflow">for</span>(k=0;k&lt;j;k++) <span class="keywordflow">if</span>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j]==<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][k])
<a name="l00345"></a>00345                 printf(<span class="stringliteral">&quot;Duplicate edges: (%d,%d) and (%d,%d) [%d]\n&quot;</span>,i,j,i,k,<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j]);
<a name="l00346"></a>00346 }
<a name="l00347"></a>00347 <span class="comment"></span>
<a name="l00348"></a>00348 <span class="comment">/** Constructs the relational table if the edges have been specified. */</span>
<a name="l00349"></a><a class="code" href="classvoro_1_1voronoicell__base.html#af49d85cd2a3daf84d623ab09ab7037cf">00349</a> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__base.html#af49d85cd2a3daf84d623ab09ab7037cf">voronoicell_base::construct_relations</a>() {
<a name="l00350"></a>00350         <span class="keywordtype">int</span> i,j,k,l;
<a name="l00351"></a>00351         <span class="keywordflow">for</span>(i=0;i&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;i++) <span class="keywordflow">for</span>(j=0;j&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#abc7ec6777725e0ddffbbe2ecbe81c6a1">nu</a>[i];j++) {
<a name="l00352"></a>00352                 k=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j];
<a name="l00353"></a>00353                 l=0;
<a name="l00354"></a>00354                 <span class="keywordflow">while</span>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l]!=i) {
<a name="l00355"></a>00355                         l++;
<a name="l00356"></a>00356                         <span class="keywordflow">if</span>(l==nu[k]) voro_fatal_error(<span class="stringliteral">&quot;Relation table construction failed&quot;</span>,<a class="code" href="config_8hh.html#ad8e0de9d48da06e86dd87884e4a2d47e">VOROPP_INTERNAL_ERROR</a>);
<a name="l00357"></a>00357                 }
<a name="l00358"></a>00358                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][nu[i]+j]=l;
<a name="l00359"></a>00359         }
<a name="l00360"></a>00360 }
<a name="l00361"></a>00361 <span class="comment"></span>
<a name="l00362"></a>00362 <span class="comment">/** Starting from a point within the current cutting plane, this routine attempts</span>
<a name="l00363"></a>00363 <span class="comment"> * to find an edge to a point outside the cutting plane. This prevents the plane</span>
<a name="l00364"></a>00364 <span class="comment"> * routine from .</span>
<a name="l00365"></a>00365 <span class="comment"> * \param[in] vc a reference to the specialized version of the calling class.</span>
<a name="l00366"></a>00366 <span class="comment"> * \param[in,out] up */</span>
<a name="l00367"></a>00367 <span class="keyword">template</span>&lt;<span class="keyword">class</span> vc_<span class="keyword">class</span>&gt;
<a name="l00368"></a>00368 <span class="keyword">inline</span> <span class="keywordtype">bool</span> voronoicell_base::search_for_outside_edge(vc_class &amp;vc,<span class="keywordtype">int</span> &amp;up) {
<a name="l00369"></a>00369         <span class="keywordtype">int</span> i,lp,lw,*j(ds2),*stackp2(ds2);
<a name="l00370"></a>00370         <span class="keywordtype">double</span> l;
<a name="l00371"></a>00371         *(stackp2++)=up;
<a name="l00372"></a>00372         <span class="keywordflow">while</span>(j&lt;stackp2) {
<a name="l00373"></a>00373                 up=*(j++);
<a name="l00374"></a>00374                 <span class="keywordflow">for</span>(i=0;i&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#abc7ec6777725e0ddffbbe2ecbe81c6a1">nu</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>];i++) {
<a name="l00375"></a>00375                         lp=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][i];
<a name="l00376"></a>00376                         lw=m_test(lp,l);
<a name="l00377"></a>00377                         <span class="keywordflow">if</span>(lw==-1) <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00378"></a>00378                         <span class="keywordflow">else</span> <span class="keywordflow">if</span>(lw==0) add_to_stack(vc,lp,stackp2);
<a name="l00379"></a>00379                 }
<a name="l00380"></a>00380         }
<a name="l00381"></a>00381         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00382"></a>00382 }
<a name="l00383"></a>00383 <span class="comment"></span>
<a name="l00384"></a>00384 <span class="comment">/** Adds a point to the auxiliary delete stack if it is not already there.</span>
<a name="l00385"></a>00385 <span class="comment"> * \param[in] vc a reference to the specialized version of the calling class.</span>
<a name="l00386"></a>00386 <span class="comment"> * \param[in] lp the index of the point to add.</span>
<a name="l00387"></a>00387 <span class="comment"> * \param[in,out] stackp2 a pointer to the end of the stack entries. */</span>
<a name="l00388"></a>00388 <span class="keyword">template</span>&lt;<span class="keyword">class</span> vc_<span class="keyword">class</span>&gt;
<a name="l00389"></a>00389 <span class="keyword">inline</span> <span class="keywordtype">void</span> voronoicell_base::add_to_stack(vc_class &amp;vc,<span class="keywordtype">int</span> lp,<span class="keywordtype">int</span> *&amp;stackp2) {
<a name="l00390"></a>00390         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> *k(ds2);k&lt;stackp2;k++) <span class="keywordflow">if</span>(*k==lp) <span class="keywordflow">return</span>;
<a name="l00391"></a>00391         <span class="keywordflow">if</span>(stackp2==stacke2) add_memory_ds2(stackp2);
<a name="l00392"></a>00392         *(stackp2++)=lp;
<a name="l00393"></a>00393 }
<a name="l00394"></a>00394 <span class="comment"></span>
<a name="l00395"></a>00395 <span class="comment">/** Cuts the Voronoi cell by a particle whose center is at a separation of</span>
<a name="l00396"></a>00396 <span class="comment"> * (x,y,z) from the cell center. The value of rsq should be initially set to</span>
<a name="l00397"></a>00397 <span class="comment"> * \f$x^2+y^2+z^2\f$.</span>
<a name="l00398"></a>00398 <span class="comment"> * \param[in] vc a reference to the specialized version of the calling class.</span>
<a name="l00399"></a>00399 <span class="comment"> * \param[in] (x,y,z) the normal vector to the plane.</span>
<a name="l00400"></a>00400 <span class="comment"> * \param[in] rsq the distance along this vector of the plane.</span>
<a name="l00401"></a>00401 <span class="comment"> * \param[in] p_id the plane ID (for neighbor tracking only).</span>
<a name="l00402"></a>00402 <span class="comment"> * \return False if the plane cut deleted the cell entirely, true otherwise. */</span>
<a name="l00403"></a>00403 <span class="keyword">template</span>&lt;<span class="keyword">class</span> vc_<span class="keyword">class</span>&gt;
<a name="l00404"></a><a class="code" href="classvoro_1_1voronoicell__base.html#a079bc593542ae5d06a9a217212435466">00404</a> <span class="keywordtype">bool</span> <a class="code" href="classvoro_1_1voronoicell__base.html#a079bc593542ae5d06a9a217212435466">voronoicell_base::nplane</a>(vc_class &amp;vc,<span class="keywordtype">double</span> x,<span class="keywordtype">double</span> y,<span class="keywordtype">double</span> z,<span class="keywordtype">double</span> rsq,<span class="keywordtype">int</span> p_id) {
<a name="l00405"></a>00405         <span class="keywordtype">int</span> count=0,i,j,k,lp=<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>,cp,qp,rp,*stackp(ds),*stackp2(ds2),*dsp;
<a name="l00406"></a>00406         <span class="keywordtype">int</span> us=0,ls=0,qs,iqs,cs,uw,qw,lw;
<a name="l00407"></a>00407         <span class="keywordtype">int</span> *edp,*edd;
<a name="l00408"></a>00408         <span class="keywordtype">double</span> u,l,r,q;<span class="keywordtype">bool</span> complicated_setup=<span class="keyword">false</span>,new_double_edge=<span class="keyword">false</span>,double_edge=<span class="keyword">false</span>;
<a name="l00409"></a>00409 
<a name="l00410"></a>00410         <span class="comment">// Initialize the safe testing routine</span>
<a name="l00411"></a>00411         n_marg=0;px=x;py=y;pz=z;prsq=rsq;
<a name="l00412"></a>00412 
<a name="l00413"></a>00413         <span class="comment">// Test approximately sqrt(n)/4 points for their proximity to the plane</span>
<a name="l00414"></a>00414         <span class="comment">// and keep the one which is closest</span>
<a name="l00415"></a>00415         uw=m_test(up,u);
<a name="l00416"></a>00416 
<a name="l00417"></a>00417         <span class="comment">// Starting from an initial guess, we now move from vertex to vertex,</span>
<a name="l00418"></a>00418         <span class="comment">// to try and find an edge which intersects the cutting plane,</span>
<a name="l00419"></a>00419         <span class="comment">// or a vertex which is on the plane</span>
<a name="l00420"></a>00420         <span class="keywordflow">try</span> {
<a name="l00421"></a>00421                 <span class="keywordflow">if</span>(uw==1) {
<a name="l00422"></a>00422 
<a name="l00423"></a>00423                         <span class="comment">// The test point is inside the cutting plane.</span>
<a name="l00424"></a>00424                         us=0;
<a name="l00425"></a>00425                         <span class="keywordflow">do</span> {
<a name="l00426"></a>00426                                 lp=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][us];
<a name="l00427"></a>00427                                 lw=m_test(lp,l);
<a name="l00428"></a>00428                                 <span class="keywordflow">if</span>(l&lt;u) <span class="keywordflow">break</span>;
<a name="l00429"></a>00429                                 us++;
<a name="l00430"></a>00430                         } <span class="keywordflow">while</span> (us&lt;nu[up]);
<a name="l00431"></a>00431 
<a name="l00432"></a>00432                         <span class="keywordflow">if</span>(us==nu[up]) {
<a name="l00433"></a>00433                                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00434"></a>00434                         }
<a name="l00435"></a>00435 
<a name="l00436"></a>00436                         ls=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>]+us];
<a name="l00437"></a>00437                         <span class="keywordflow">while</span>(lw==1) {
<a name="l00438"></a>00438                                 <span class="keywordflow">if</span>(++count&gt;=<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>) <span class="keywordflow">throw</span> <span class="keyword">true</span>;
<a name="l00439"></a>00439                                 u=l;up=lp;
<a name="l00440"></a>00440                                 <span class="keywordflow">for</span>(us=0;us&lt;ls;us++) {
<a name="l00441"></a>00441                                         lp=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][us];
<a name="l00442"></a>00442                                         lw=m_test(lp,l);
<a name="l00443"></a>00443                                         <span class="keywordflow">if</span>(l&lt;u) <span class="keywordflow">break</span>;
<a name="l00444"></a>00444                                 }
<a name="l00445"></a>00445                                 <span class="keywordflow">if</span>(us==ls) {
<a name="l00446"></a>00446                                         us++;
<a name="l00447"></a>00447                                         <span class="keywordflow">while</span>(us&lt;nu[up]) {
<a name="l00448"></a>00448                                                 lp=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][us];
<a name="l00449"></a>00449                                                 lw=m_test(lp,l);
<a name="l00450"></a>00450                                                 <span class="keywordflow">if</span>(l&lt;u) <span class="keywordflow">break</span>;
<a name="l00451"></a>00451                                                 us++;
<a name="l00452"></a>00452                                         }
<a name="l00453"></a>00453                                         <span class="keywordflow">if</span>(us==nu[up]) {
<a name="l00454"></a>00454                                                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00455"></a>00455                                         }
<a name="l00456"></a>00456                                 }
<a name="l00457"></a>00457                                 ls=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>]+us];
<a name="l00458"></a>00458                         }
<a name="l00459"></a>00459 
<a name="l00460"></a>00460                         <span class="comment">// If the last point in the iteration is within the</span>
<a name="l00461"></a>00461                         <span class="comment">// plane, we need to do the complicated setup</span>
<a name="l00462"></a>00462                         <span class="comment">// routine. Otherwise, we use the regular iteration.</span>
<a name="l00463"></a>00463                         <span class="keywordflow">if</span>(lw==0) {
<a name="l00464"></a>00464                                 up=lp;
<a name="l00465"></a>00465                                 complicated_setup=<span class="keyword">true</span>;
<a name="l00466"></a>00466                         } <span class="keywordflow">else</span> complicated_setup=<span class="keyword">false</span>;
<a name="l00467"></a>00467                 } <span class="keywordflow">else</span> <span class="keywordflow">if</span>(uw==-1) {
<a name="l00468"></a>00468                         us=0;
<a name="l00469"></a>00469                         <span class="keywordflow">do</span> {
<a name="l00470"></a>00470                                 qp=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][us];
<a name="l00471"></a>00471                                 qw=m_test(qp,q);
<a name="l00472"></a>00472                                 <span class="keywordflow">if</span>(u&lt;q) <span class="keywordflow">break</span>;
<a name="l00473"></a>00473                                 us++;
<a name="l00474"></a>00474                         } <span class="keywordflow">while</span> (us&lt;nu[up]);
<a name="l00475"></a>00475                         <span class="keywordflow">if</span>(us==nu[up]) <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00476"></a>00476 
<a name="l00477"></a>00477                         <span class="keywordflow">while</span>(qw==-1) {
<a name="l00478"></a>00478                                 qs=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>]+us];
<a name="l00479"></a>00479                                 <span class="keywordflow">if</span>(++count&gt;=<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>) <span class="keywordflow">throw</span> <span class="keyword">true</span>;
<a name="l00480"></a>00480                                 u=q;up=qp;
<a name="l00481"></a>00481                                 <span class="keywordflow">for</span>(us=0;us&lt;qs;us++) {
<a name="l00482"></a>00482                                         qp=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][us];
<a name="l00483"></a>00483                                         qw=m_test(qp,q);
<a name="l00484"></a>00484                                         <span class="keywordflow">if</span>(u&lt;q) <span class="keywordflow">break</span>;
<a name="l00485"></a>00485                                 }
<a name="l00486"></a>00486                                 <span class="keywordflow">if</span>(us==qs) {
<a name="l00487"></a>00487                                         us++;
<a name="l00488"></a>00488                                         <span class="keywordflow">while</span>(us&lt;nu[up]) {
<a name="l00489"></a>00489                                                 qp=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][us];
<a name="l00490"></a>00490                                                 qw=m_test(qp,q);
<a name="l00491"></a>00491                                                 <span class="keywordflow">if</span>(u&lt;q) <span class="keywordflow">break</span>;
<a name="l00492"></a>00492                                                 us++;
<a name="l00493"></a>00493                                         }
<a name="l00494"></a>00494                                         <span class="keywordflow">if</span>(us==nu[up]) <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00495"></a>00495                                 }
<a name="l00496"></a>00496                         }
<a name="l00497"></a>00497                         <span class="keywordflow">if</span>(qw==1) {
<a name="l00498"></a>00498                                 lp=<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>;ls=us;l=u;
<a name="l00499"></a>00499                                 up=qp;us=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[lp][nu[lp]+ls];u=q;
<a name="l00500"></a>00500                                 complicated_setup=<span class="keyword">false</span>;
<a name="l00501"></a>00501                         } <span class="keywordflow">else</span> {
<a name="l00502"></a>00502                                 up=qp;
<a name="l00503"></a>00503                                 complicated_setup=<span class="keyword">true</span>;
<a name="l00504"></a>00504                         }
<a name="l00505"></a>00505                 } <span class="keywordflow">else</span> {
<a name="l00506"></a>00506 
<a name="l00507"></a>00507                         <span class="comment">// Our original test point was on the plane, so we</span>
<a name="l00508"></a>00508                         <span class="comment">// automatically head for the complicated setup</span>
<a name="l00509"></a>00509                         <span class="comment">// routine</span>
<a name="l00510"></a>00510                         complicated_setup=<span class="keyword">true</span>;
<a name="l00511"></a>00511                 }
<a name="l00512"></a>00512         }
<a name="l00513"></a>00513         <span class="keywordflow">catch</span>(<span class="keywordtype">bool</span> except) {
<a name="l00514"></a>00514                 <span class="comment">// This routine is a fall-back, in case floating point errors</span>
<a name="l00515"></a>00515                 <span class="comment">// cause the usual search routine to fail. In the fall-back</span>
<a name="l00516"></a>00516                 <span class="comment">// routine, we just test every edge to find one straddling</span>
<a name="l00517"></a>00517                 <span class="comment">// the plane.</span>
<a name="l00518"></a>00518 <span class="preprocessor">#if VOROPP_VERBOSE &gt;=1</span>
<a name="l00519"></a>00519 <span class="preprocessor"></span>                fputs(<span class="stringliteral">&quot;Bailed out of convex calculation\n&quot;</span>,stderr);
<a name="l00520"></a>00520 <span class="preprocessor">#endif</span>
<a name="l00521"></a>00521 <span class="preprocessor"></span>                qw=1;lw=0;
<a name="l00522"></a>00522                 <span class="keywordflow">for</span>(qp=0;qp&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;qp++) {
<a name="l00523"></a>00523                         qw=m_test(qp,q);
<a name="l00524"></a>00524                         <span class="keywordflow">if</span>(qw==1) {
<a name="l00525"></a>00525 
<a name="l00526"></a>00526                                 <span class="comment">// The point is inside the cutting space. Now</span>
<a name="l00527"></a>00527                                 <span class="comment">// see if we can find a neighbor which isn&#39;t.</span>
<a name="l00528"></a>00528                                 <span class="keywordflow">for</span>(us=0;us&lt;nu[qp];us++) {
<a name="l00529"></a>00529                                         lp=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[qp][us];
<a name="l00530"></a>00530                                         <span class="keywordflow">if</span>(lp&lt;qp) {
<a name="l00531"></a>00531                                                 lw=m_test(lp,l);
<a name="l00532"></a>00532                                                 <span class="keywordflow">if</span>(lw!=1) <span class="keywordflow">break</span>;
<a name="l00533"></a>00533                                         }
<a name="l00534"></a>00534                                 }
<a name="l00535"></a>00535                                 <span class="keywordflow">if</span>(us&lt;nu[qp]) {
<a name="l00536"></a>00536                                         up=qp;
<a name="l00537"></a>00537                                         <span class="keywordflow">if</span>(lw==0) {
<a name="l00538"></a>00538                                                 complicated_setup=<span class="keyword">true</span>;
<a name="l00539"></a>00539                                         } <span class="keywordflow">else</span> {
<a name="l00540"></a>00540                                                 complicated_setup=<span class="keyword">false</span>;
<a name="l00541"></a>00541                                                 u=q;
<a name="l00542"></a>00542                                                 ls=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>]+us];
<a name="l00543"></a>00543                                         }
<a name="l00544"></a>00544                                         <span class="keywordflow">break</span>;
<a name="l00545"></a>00545                                 }
<a name="l00546"></a>00546                         } <span class="keywordflow">else</span> <span class="keywordflow">if</span>(qw==-1) {
<a name="l00547"></a>00547 
<a name="l00548"></a>00548                                 <span class="comment">// The point is outside the cutting space. See</span>
<a name="l00549"></a>00549                                 <span class="comment">// if we can find a neighbor which isn&#39;t.</span>
<a name="l00550"></a>00550                                 <span class="keywordflow">for</span>(ls=0;ls&lt;nu[qp];ls++) {
<a name="l00551"></a>00551                                         up=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[qp][ls];
<a name="l00552"></a>00552                                         <span class="keywordflow">if</span>(up&lt;qp) {
<a name="l00553"></a>00553                                                 uw=m_test(up,u);
<a name="l00554"></a>00554                                                 <span class="keywordflow">if</span>(uw!=-1) <span class="keywordflow">break</span>;
<a name="l00555"></a>00555                                         }
<a name="l00556"></a>00556                                 }
<a name="l00557"></a>00557                                 <span class="keywordflow">if</span>(ls&lt;nu[qp]) {
<a name="l00558"></a>00558                                         <span class="keywordflow">if</span>(uw==0) {
<a name="l00559"></a>00559                                                 up=qp;
<a name="l00560"></a>00560                                                 complicated_setup=<span class="keyword">true</span>;
<a name="l00561"></a>00561                                         } <span class="keywordflow">else</span> {
<a name="l00562"></a>00562                                                 complicated_setup=<span class="keyword">false</span>;
<a name="l00563"></a>00563                                                 lp=qp;l=q;
<a name="l00564"></a>00564                                                 us=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[lp][nu[lp]+ls];
<a name="l00565"></a>00565                                         }
<a name="l00566"></a>00566                                         <span class="keywordflow">break</span>;
<a name="l00567"></a>00567                                 }
<a name="l00568"></a>00568                         } <span class="keywordflow">else</span> {
<a name="l00569"></a>00569 
<a name="l00570"></a>00570                                 <span class="comment">// The point is in the plane, so we just</span>
<a name="l00571"></a>00571                                 <span class="comment">// proceed with the complicated setup routine</span>
<a name="l00572"></a>00572                                 up=qp;
<a name="l00573"></a>00573                                 complicated_setup=<span class="keyword">true</span>;
<a name="l00574"></a>00574                                 <span class="keywordflow">break</span>;
<a name="l00575"></a>00575                         }
<a name="l00576"></a>00576                 }
<a name="l00577"></a>00577                 <span class="keywordflow">if</span>(qp==p) <span class="keywordflow">return</span> qw==-1?<span class="keyword">true</span>:<span class="keyword">false</span>;
<a name="l00578"></a>00578         }
<a name="l00579"></a>00579 
<a name="l00580"></a>00580         <span class="comment">// We&#39;re about to add the first point of the new facet. In either</span>
<a name="l00581"></a>00581         <span class="comment">// routine, we have to add a point, so first check there&#39;s space for</span>
<a name="l00582"></a>00582         <span class="comment">// it.</span>
<a name="l00583"></a>00583         <span class="keywordflow">if</span>(<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>==current_vertices) add_memory_vertices(vc);
<a name="l00584"></a>00584 
<a name="l00585"></a>00585         <span class="keywordflow">if</span>(complicated_setup) {
<a name="l00586"></a>00586 
<a name="l00587"></a>00587                 <span class="comment">// We want to be strict about reaching the conclusion that the</span>
<a name="l00588"></a>00588                 <span class="comment">// cell is entirely within the cutting plane. It&#39;s not enough</span>
<a name="l00589"></a>00589                 <span class="comment">// to find a vertex that has edges which are all inside or on</span>
<a name="l00590"></a>00590                 <span class="comment">// the plane. If the vertex has neighbors that are also on the</span>
<a name="l00591"></a>00591                 <span class="comment">// plane, we should check those too.</span>
<a name="l00592"></a>00592                 <span class="keywordflow">if</span>(!search_for_outside_edge(vc,up)) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00593"></a>00593 
<a name="l00594"></a>00594                 <span class="comment">// The search algorithm found a point which is on the cutting</span>
<a name="l00595"></a>00595                 <span class="comment">// plane. We leave that point in place, and create a new one at</span>
<a name="l00596"></a>00596                 <span class="comment">// the same location.</span>
<a name="l00597"></a>00597                 <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>];
<a name="l00598"></a>00598                 <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>+1]=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*up+1];
<a name="l00599"></a>00599                 <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>+2]=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*up+2];
<a name="l00600"></a>00600 
<a name="l00601"></a>00601                 <span class="comment">// Search for a collection of edges of the test vertex which</span>
<a name="l00602"></a>00602                 <span class="comment">// are outside of the cutting space. Begin by testing the</span>
<a name="l00603"></a>00603                 <span class="comment">// zeroth edge.</span>
<a name="l00604"></a>00604                 i=0;
<a name="l00605"></a>00605                 lp=*<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>];
<a name="l00606"></a>00606                 lw=m_test(lp,l);
<a name="l00607"></a>00607                 <span class="keywordflow">if</span>(lw!=-1) {
<a name="l00608"></a>00608 
<a name="l00609"></a>00609                         <span class="comment">// The first edge is either inside the cutting space,</span>
<a name="l00610"></a>00610                         <span class="comment">// or lies within the cutting plane. Test the edges</span>
<a name="l00611"></a>00611                         <span class="comment">// sequentially until we find one that is outside.</span>
<a name="l00612"></a>00612                         rp=lw;
<a name="l00613"></a>00613                         <span class="keywordflow">do</span> {
<a name="l00614"></a>00614                                 i++;
<a name="l00615"></a>00615 
<a name="l00616"></a>00616                                 <span class="comment">// If we reached the last edge with no luck</span>
<a name="l00617"></a>00617                                 <span class="comment">// then all of the vertices are inside</span>
<a name="l00618"></a>00618                                 <span class="comment">// or on the plane, so the cell is completely</span>
<a name="l00619"></a>00619                                 <span class="comment">// deleted</span>
<a name="l00620"></a>00620                                 <span class="keywordflow">if</span>(i==nu[up]) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00621"></a>00621                                 lp=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][i];
<a name="l00622"></a>00622                                 lw=m_test(lp,l);
<a name="l00623"></a>00623                         } <span class="keywordflow">while</span> (lw!=-1);
<a name="l00624"></a>00624                         j=i+1;
<a name="l00625"></a>00625 
<a name="l00626"></a>00626                         <span class="comment">// We found an edge outside the cutting space. Keep</span>
<a name="l00627"></a>00627                         <span class="comment">// moving through these edges until we find one that&#39;s</span>
<a name="l00628"></a>00628                         <span class="comment">// inside or on the plane.</span>
<a name="l00629"></a>00629                         <span class="keywordflow">while</span>(j&lt;nu[up]) {
<a name="l00630"></a>00630                                 lp=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][j];
<a name="l00631"></a>00631                                 lw=m_test(lp,l);
<a name="l00632"></a>00632                                 <span class="keywordflow">if</span>(lw!=-1) <span class="keywordflow">break</span>;
<a name="l00633"></a>00633                                 j++;
<a name="l00634"></a>00634                         }
<a name="l00635"></a>00635 
<a name="l00636"></a>00636                         <span class="comment">// Compute the number of edges for the new vertex. In</span>
<a name="l00637"></a>00637                         <span class="comment">// general it will be the number of outside edges</span>
<a name="l00638"></a>00638                         <span class="comment">// found, plus two. But we need to recognize the</span>
<a name="l00639"></a>00639                         <span class="comment">// special case when all but one edge is outside, and</span>
<a name="l00640"></a>00640                         <span class="comment">// the remaining one is on the plane. For that case we</span>
<a name="l00641"></a>00641                         <span class="comment">// have to reduce the edge count by one to prevent</span>
<a name="l00642"></a>00642                         <span class="comment">// doubling up.</span>
<a name="l00643"></a>00643                         <span class="keywordflow">if</span>(j==nu[up]&amp;&amp;i==1&amp;&amp;rp==0) {
<a name="l00644"></a>00644                                 nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]=nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>];
<a name="l00645"></a>00645                                 double_edge=<span class="keyword">true</span>;
<a name="l00646"></a>00646                         } <span class="keywordflow">else</span> nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]=j-i+2;
<a name="l00647"></a>00647                         k=1;
<a name="l00648"></a>00648 
<a name="l00649"></a>00649                         <span class="comment">// Add memory for the new vertex if needed, and</span>
<a name="l00650"></a>00650                         <span class="comment">// initialize</span>
<a name="l00651"></a>00651                         <span class="keywordflow">while</span> (nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]&gt;=current_vertex_order) add_memory_vorder(vc);
<a name="l00652"></a>00652                         <span class="keywordflow">if</span>(<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]]==mem[nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]]) add_memory(vc,nu[p],stackp2);
<a name="l00653"></a>00653                         vc.n_set_pointer(p,nu[p]);
<a name="l00654"></a>00654                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]=<a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]]+((nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]&lt;&lt;1)+1)*<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]]++;
<a name="l00655"></a>00655                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>][nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]&lt;&lt;1]=<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;
<a name="l00656"></a>00656 
<a name="l00657"></a>00657                         <span class="comment">// Copy the edges of the original vertex into the new</span>
<a name="l00658"></a>00658                         <span class="comment">// one. Delete the edges of the original vertex, and</span>
<a name="l00659"></a>00659                         <span class="comment">// update the relational table.</span>
<a name="l00660"></a>00660                         us=<a class="code" href="classvoro_1_1voronoicell__base.html#adfccfa7dce395277535f61f780d87c8b">cycle_down</a>(i,up);
<a name="l00661"></a>00661                         <span class="keywordflow">while</span>(i&lt;j) {
<a name="l00662"></a>00662                                 qp=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][i];
<a name="l00663"></a>00663                                 qs=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>]+i];
<a name="l00664"></a>00664                                 vc.n_copy(p,k,up,i);
<a name="l00665"></a>00665                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>][k]=qp;
<a name="l00666"></a>00666                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>][nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]+k]=qs;
<a name="l00667"></a>00667                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[qp][qs]=<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;
<a name="l00668"></a>00668                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[qp][nu[qp]+qs]=k;
<a name="l00669"></a>00669                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][i]=-1;
<a name="l00670"></a>00670                                 i++;k++;
<a name="l00671"></a>00671                         }
<a name="l00672"></a>00672                         qs=i==nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>]?0:i;
<a name="l00673"></a>00673                 } <span class="keywordflow">else</span> {
<a name="l00674"></a>00674 
<a name="l00675"></a>00675                         <span class="comment">// In this case, the zeroth edge is outside the cutting</span>
<a name="l00676"></a>00676                         <span class="comment">// plane. Begin by searching backwards from the last</span>
<a name="l00677"></a>00677                         <span class="comment">// edge until we find an edge which isn&#39;t outside.</span>
<a name="l00678"></a>00678                         i=nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>]-1;
<a name="l00679"></a>00679                         lp=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][i];
<a name="l00680"></a>00680                         lw=m_test(lp,l);
<a name="l00681"></a>00681                         <span class="keywordflow">while</span>(lw==-1) {
<a name="l00682"></a>00682                                 i--;
<a name="l00683"></a>00683 
<a name="l00684"></a>00684                                 <span class="comment">// If i reaches zero, then we have a point in</span>
<a name="l00685"></a>00685                                 <span class="comment">// the plane all of whose edges are outside</span>
<a name="l00686"></a>00686                                 <span class="comment">// the cutting space, so we just exit</span>
<a name="l00687"></a>00687                                 <span class="keywordflow">if</span>(i==0) <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00688"></a>00688                                 lp=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][i];
<a name="l00689"></a>00689                                 lw=m_test(lp,l);
<a name="l00690"></a>00690                         }
<a name="l00691"></a>00691 
<a name="l00692"></a>00692                         <span class="comment">// Now search forwards from zero</span>
<a name="l00693"></a>00693                         j=1;
<a name="l00694"></a>00694                         qp=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][j];
<a name="l00695"></a>00695                         qw=m_test(qp,q);
<a name="l00696"></a>00696                         <span class="keywordflow">while</span>(qw==-1) {
<a name="l00697"></a>00697                                 j++;
<a name="l00698"></a>00698                                 qp=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][j];
<a name="l00699"></a>00699                                 qw=m_test(qp,l);
<a name="l00700"></a>00700                         }
<a name="l00701"></a>00701 
<a name="l00702"></a>00702                         <span class="comment">// Compute the number of edges for the new vertex. In</span>
<a name="l00703"></a>00703                         <span class="comment">// general it will be the number of outside edges</span>
<a name="l00704"></a>00704                         <span class="comment">// found, plus two. But we need to recognize the</span>
<a name="l00705"></a>00705                         <span class="comment">// special case when all but one edge is outside, and</span>
<a name="l00706"></a>00706                         <span class="comment">// the remaining one is on the plane. For that case we</span>
<a name="l00707"></a>00707                         <span class="comment">// have to reduce the edge count by one to prevent</span>
<a name="l00708"></a>00708                         <span class="comment">// doubling up.</span>
<a name="l00709"></a>00709                         <span class="keywordflow">if</span>(i==j&amp;&amp;qw==0) {
<a name="l00710"></a>00710                                 double_edge=<span class="keyword">true</span>;
<a name="l00711"></a>00711                                 nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]=nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>];
<a name="l00712"></a>00712                         } <span class="keywordflow">else</span> {
<a name="l00713"></a>00713                                 nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]=nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>]-i+j+1;
<a name="l00714"></a>00714                         }
<a name="l00715"></a>00715 
<a name="l00716"></a>00716                         <span class="comment">// Add memory to store the vertex if it doesn&#39;t exist</span>
<a name="l00717"></a>00717                         <span class="comment">// already</span>
<a name="l00718"></a>00718                         k=1;
<a name="l00719"></a>00719                         <span class="keywordflow">while</span>(nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]&gt;=current_vertex_order) add_memory_vorder(vc);
<a name="l00720"></a>00720                         <span class="keywordflow">if</span>(<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]]==mem[nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]]) add_memory(vc,nu[p],stackp2);
<a name="l00721"></a>00721 
<a name="l00722"></a>00722                         <span class="comment">// Copy the edges of the original vertex into the new</span>
<a name="l00723"></a>00723                         <span class="comment">// one. Delete the edges of the original vertex, and</span>
<a name="l00724"></a>00724                         <span class="comment">// update the relational table.</span>
<a name="l00725"></a>00725                         vc.n_set_pointer(p,nu[p]);
<a name="l00726"></a>00726                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]=<a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]]+((nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]&lt;&lt;1)+1)*<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]]++;
<a name="l00727"></a>00727                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>][nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]&lt;&lt;1]=<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;
<a name="l00728"></a>00728                         us=i++;
<a name="l00729"></a>00729                         <span class="keywordflow">while</span>(i&lt;nu[up]) {
<a name="l00730"></a>00730                                 qp=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][i];
<a name="l00731"></a>00731                                 qs=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>]+i];
<a name="l00732"></a>00732                                 vc.n_copy(p,k,up,i);
<a name="l00733"></a>00733                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>][k]=qp;
<a name="l00734"></a>00734                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>][nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]+k]=qs;
<a name="l00735"></a>00735                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[qp][qs]=<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;
<a name="l00736"></a>00736                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[qp][nu[qp]+qs]=k;
<a name="l00737"></a>00737                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][i]=-1;
<a name="l00738"></a>00738                                 i++;k++;
<a name="l00739"></a>00739                         }
<a name="l00740"></a>00740                         i=0;
<a name="l00741"></a>00741                         <span class="keywordflow">while</span>(i&lt;j) {
<a name="l00742"></a>00742                                 qp=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][i];
<a name="l00743"></a>00743                                 qs=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>]+i];
<a name="l00744"></a>00744                                 vc.n_copy(p,k,up,i);
<a name="l00745"></a>00745                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>][k]=qp;
<a name="l00746"></a>00746                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>][nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]+k]=qs;
<a name="l00747"></a>00747                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[qp][qs]=<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;
<a name="l00748"></a>00748                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[qp][nu[qp]+qs]=k;
<a name="l00749"></a>00749                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][i]=-1;
<a name="l00750"></a>00750                                 i++;k++;
<a name="l00751"></a>00751                         }
<a name="l00752"></a>00752                         qs=j;
<a name="l00753"></a>00753                 }
<a name="l00754"></a>00754                 <span class="keywordflow">if</span>(!double_edge) {
<a name="l00755"></a>00755                         vc.n_copy(<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>,k,up,qs);
<a name="l00756"></a>00756                         vc.n_set(<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>,0,p_id);
<a name="l00757"></a>00757                 } <span class="keywordflow">else</span> vc.n_copy(<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>,0,up,qs);
<a name="l00758"></a>00758 
<a name="l00759"></a>00759                 <span class="comment">// Add this point to the auxiliary delete stack</span>
<a name="l00760"></a>00760                 <span class="keywordflow">if</span>(stackp2==stacke2) add_memory_ds2(stackp2);
<a name="l00761"></a>00761                 *(stackp2++)=up;
<a name="l00762"></a>00762 
<a name="l00763"></a>00763                 <span class="comment">// Look at the edges on either side of the group that was</span>
<a name="l00764"></a>00764                 <span class="comment">// detected. We&#39;re going to commence facet computation by</span>
<a name="l00765"></a>00765                 <span class="comment">// moving along one of them. We are going to end up coming back</span>
<a name="l00766"></a>00766                 <span class="comment">// along the other one.</span>
<a name="l00767"></a>00767                 cs=k;
<a name="l00768"></a>00768                 qp=<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>;q=u;
<a name="l00769"></a>00769                 i=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][us];
<a name="l00770"></a>00770                 us=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>]+us];
<a name="l00771"></a>00771                 up=i;
<a name="l00772"></a>00772                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[qp][nu[qp]&lt;&lt;1]=-<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;
<a name="l00773"></a>00773 
<a name="l00774"></a>00774         } <span class="keywordflow">else</span> {
<a name="l00775"></a>00775 
<a name="l00776"></a>00776                 <span class="comment">// The search algorithm found an intersected edge between the</span>
<a name="l00777"></a>00777                 <span class="comment">// points lp and up. Create a new vertex between them which</span>
<a name="l00778"></a>00778                 <span class="comment">// lies on the cutting plane. Since u and l differ by at least</span>
<a name="l00779"></a>00779                 <span class="comment">// the tolerance, this division should never screw up.</span>
<a name="l00780"></a>00780                 <span class="keywordflow">if</span>(stackp==stacke) add_memory_ds(stackp);
<a name="l00781"></a>00781                 *(stackp++)=up;
<a name="l00782"></a>00782                 r=u/(u-l);l=1-r;
<a name="l00783"></a>00783                 <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*lp]*r+<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>]*l;
<a name="l00784"></a>00784                 <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>+1]=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*lp+1]*r+<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*up+1]*l;
<a name="l00785"></a>00785                 <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>+2]=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*lp+2]*r+<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*up+2]*l;
<a name="l00786"></a>00786 
<a name="l00787"></a>00787                 <span class="comment">// This point will always have three edges. Connect one of them</span>
<a name="l00788"></a>00788                 <span class="comment">// to lp.</span>
<a name="l00789"></a>00789                 nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]=3;
<a name="l00790"></a>00790                 <span class="keywordflow">if</span>(<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[3]==mem[3]) add_memory(vc,3,stackp2);
<a name="l00791"></a>00791                 vc.n_set_pointer(<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>,3);
<a name="l00792"></a>00792                 vc.n_set(<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>,0,p_id);
<a name="l00793"></a>00793                 vc.n_copy(<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>,1,up,us);
<a name="l00794"></a>00794                 vc.n_copy(<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>,2,lp,ls);
<a name="l00795"></a>00795                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]=<a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[3]+7*<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[3]++;
<a name="l00796"></a>00796                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>][6]=<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;
<a name="l00797"></a>00797                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][us]=-1;
<a name="l00798"></a>00798                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[lp][ls]=<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;
<a name="l00799"></a>00799                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[lp][nu[lp]+ls]=1;
<a name="l00800"></a>00800                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>][1]=lp;
<a name="l00801"></a>00801                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>][nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]+1]=ls;
<a name="l00802"></a>00802                 cs=2;
<a name="l00803"></a>00803 
<a name="l00804"></a>00804                 <span class="comment">// Set the direction to move in</span>
<a name="l00805"></a>00805                 qs=<a class="code" href="classvoro_1_1voronoicell__base.html#a1d86762311d8860960a45cc409b14f0f">cycle_up</a>(us,up);
<a name="l00806"></a>00806                 qp=<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>;q=u;
<a name="l00807"></a>00807         }
<a name="l00808"></a>00808 
<a name="l00809"></a>00809         <span class="comment">// When the code reaches here, we have initialized the first point, and</span>
<a name="l00810"></a>00810         <span class="comment">// we have a direction for moving it to construct the rest of the facet</span>
<a name="l00811"></a>00811         cp=<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;rp=<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>++;
<a name="l00812"></a>00812         <span class="keywordflow">while</span>(qp!=up||qs!=us) {
<a name="l00813"></a>00813 
<a name="l00814"></a>00814                 <span class="comment">// We&#39;re currently tracing round an intersected facet. Keep</span>
<a name="l00815"></a>00815                 <span class="comment">// moving around it until we find a point or edge which</span>
<a name="l00816"></a>00816                 <span class="comment">// intersects the plane.</span>
<a name="l00817"></a>00817                 lp=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[qp][qs];
<a name="l00818"></a>00818                 lw=m_test(lp,l);
<a name="l00819"></a>00819 
<a name="l00820"></a>00820                 <span class="keywordflow">if</span>(lw==1) {
<a name="l00821"></a>00821 
<a name="l00822"></a>00822                         <span class="comment">// The point is still in the cutting space. Just add it</span>
<a name="l00823"></a>00823                         <span class="comment">// to the delete stack and keep moving.</span>
<a name="l00824"></a>00824                         qs=<a class="code" href="classvoro_1_1voronoicell__base.html#a1d86762311d8860960a45cc409b14f0f">cycle_up</a>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[qp][nu[qp]+qs],lp);
<a name="l00825"></a>00825                         qp=lp;
<a name="l00826"></a>00826                         q=l;
<a name="l00827"></a>00827                         <span class="keywordflow">if</span>(stackp==stacke) add_memory_ds(stackp);
<a name="l00828"></a>00828                         *(stackp++)=qp;
<a name="l00829"></a>00829 
<a name="l00830"></a>00830                 } <span class="keywordflow">else</span> <span class="keywordflow">if</span>(lw==-1) {
<a name="l00831"></a>00831 
<a name="l00832"></a>00832                         <span class="comment">// The point is outside of the cutting space, so we&#39;ve</span>
<a name="l00833"></a>00833                         <span class="comment">// found an intersected edge. Introduce a regular point</span>
<a name="l00834"></a>00834                         <span class="comment">// at the point of intersection. Connect it to the</span>
<a name="l00835"></a>00835                         <span class="comment">// point we just tested. Also connect it to the previous</span>
<a name="l00836"></a>00836                         <span class="comment">// new point in the facet we&#39;re constructing.</span>
<a name="l00837"></a>00837                         <span class="keywordflow">if</span>(<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>==current_vertices) add_memory_vertices(vc);
<a name="l00838"></a>00838                         r=q/(q-l);l=1-r;
<a name="l00839"></a>00839                         <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*lp]*r+<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*qp]*l;
<a name="l00840"></a>00840                         <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>+1]=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*lp+1]*r+<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*qp+1]*l;
<a name="l00841"></a>00841                         <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>+2]=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*lp+2]*r+<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*qp+2]*l;
<a name="l00842"></a>00842                         nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]=3;
<a name="l00843"></a>00843                         <span class="keywordflow">if</span>(<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[3]==mem[3]) add_memory(vc,3,stackp2);
<a name="l00844"></a>00844                         ls=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[qp][qs+nu[qp]];
<a name="l00845"></a>00845                         vc.n_set_pointer(<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>,3);
<a name="l00846"></a>00846                         vc.n_set(<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>,0,p_id);
<a name="l00847"></a>00847                         vc.n_copy(<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>,1,qp,qs);
<a name="l00848"></a>00848                         vc.n_copy(<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>,2,lp,ls);
<a name="l00849"></a>00849                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]=<a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[3]+7*<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[3]++;
<a name="l00850"></a>00850                         *<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]=cp;
<a name="l00851"></a>00851                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>][1]=lp;
<a name="l00852"></a>00852                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>][3]=cs;
<a name="l00853"></a>00853                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>][4]=ls;
<a name="l00854"></a>00854                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>][6]=<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;
<a name="l00855"></a>00855                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[lp][ls]=<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;
<a name="l00856"></a>00856                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[lp][nu[lp]+ls]=1;
<a name="l00857"></a>00857                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[cp][cs]=<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;
<a name="l00858"></a>00858                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[cp][nu[cp]+cs]=0;
<a name="l00859"></a>00859                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[qp][qs]=-1;
<a name="l00860"></a>00860                         qs=<a class="code" href="classvoro_1_1voronoicell__base.html#a1d86762311d8860960a45cc409b14f0f">cycle_up</a>(qs,qp);
<a name="l00861"></a>00861                         cp=<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>++;
<a name="l00862"></a>00862                         cs=2;
<a name="l00863"></a>00863                 } <span class="keywordflow">else</span> {
<a name="l00864"></a>00864 
<a name="l00865"></a>00865                         <span class="comment">// We&#39;ve found a point which is on the cutting plane.</span>
<a name="l00866"></a>00866                         <span class="comment">// We&#39;re going to introduce a new point right here, but</span>
<a name="l00867"></a>00867                         <span class="comment">// first we need to figure out the number of edges it</span>
<a name="l00868"></a>00868                         <span class="comment">// has.</span>
<a name="l00869"></a>00869                         <span class="keywordflow">if</span>(<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>==current_vertices) add_memory_vertices(vc);
<a name="l00870"></a>00870 
<a name="l00871"></a>00871                         <span class="comment">// If the previous vertex detected a double edge, our</span>
<a name="l00872"></a>00872                         <span class="comment">// new vertex will have one less edge.</span>
<a name="l00873"></a>00873                         k=double_edge?0:1;
<a name="l00874"></a>00874                         qs=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[qp][nu[qp]+qs];
<a name="l00875"></a>00875                         qp=lp;
<a name="l00876"></a>00876                         iqs=qs;
<a name="l00877"></a>00877 
<a name="l00878"></a>00878                         <span class="comment">// Start testing the edges of the current point until</span>
<a name="l00879"></a>00879                         <span class="comment">// we find one which isn&#39;t outside the cutting space</span>
<a name="l00880"></a>00880                         <span class="keywordflow">do</span> {
<a name="l00881"></a>00881                                 k++;
<a name="l00882"></a>00882                                 qs=<a class="code" href="classvoro_1_1voronoicell__base.html#a1d86762311d8860960a45cc409b14f0f">cycle_up</a>(qs,qp);
<a name="l00883"></a>00883                                 lp=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[qp][qs];
<a name="l00884"></a>00884                                 lw=m_test(lp,l);
<a name="l00885"></a>00885                         } <span class="keywordflow">while</span> (lw==-1);
<a name="l00886"></a>00886 
<a name="l00887"></a>00887                         <span class="comment">// Now we need to find out whether this marginal vertex</span>
<a name="l00888"></a>00888                         <span class="comment">// we are on has been visited before, because if that&#39;s</span>
<a name="l00889"></a>00889                         <span class="comment">// the case, we need to add vertices to the existing</span>
<a name="l00890"></a>00890                         <span class="comment">// new vertex, rather than creating a fresh one. We also</span>
<a name="l00891"></a>00891                         <span class="comment">// need to figure out whether we&#39;re in a case where we</span>
<a name="l00892"></a>00892                         <span class="comment">// might be creating a duplicate edge.</span>
<a name="l00893"></a>00893                         j=-<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[qp][nu[qp]&lt;&lt;1];
<a name="l00894"></a>00894                         <span class="keywordflow">if</span>(qp==up&amp;&amp;qs==us) {
<a name="l00895"></a>00895 
<a name="l00896"></a>00896                                 <span class="comment">// If we&#39;re heading into the final part of the</span>
<a name="l00897"></a>00897                                 <span class="comment">// new facet, then we never worry about the</span>
<a name="l00898"></a>00898                                 <span class="comment">// duplicate edge calculation.</span>
<a name="l00899"></a>00899                                 new_double_edge=<span class="keyword">false</span>;
<a name="l00900"></a>00900                                 <span class="keywordflow">if</span>(j&gt;0) k+=nu[j];
<a name="l00901"></a>00901                         } <span class="keywordflow">else</span> {
<a name="l00902"></a>00902                                 <span class="keywordflow">if</span>(j&gt;0) {
<a name="l00903"></a>00903 
<a name="l00904"></a>00904                                         <span class="comment">// This vertex was visited before, so</span>
<a name="l00905"></a>00905                                         <span class="comment">// count those vertices to the ones we</span>
<a name="l00906"></a>00906                                         <span class="comment">// already have.</span>
<a name="l00907"></a>00907                                         k+=nu[j];
<a name="l00908"></a>00908 
<a name="l00909"></a>00909                                         <span class="comment">// The only time when we might make a</span>
<a name="l00910"></a>00910                                         <span class="comment">// duplicate edge is if the point we&#39;re</span>
<a name="l00911"></a>00911                                         <span class="comment">// going to move to next is also a</span>
<a name="l00912"></a>00912                                         <span class="comment">// marginal point, so test for that</span>
<a name="l00913"></a>00913                                         <span class="comment">// first.</span>
<a name="l00914"></a>00914                                         <span class="keywordflow">if</span>(lw==0) {
<a name="l00915"></a>00915 
<a name="l00916"></a>00916                                                 <span class="comment">// Now see whether this marginal point</span>
<a name="l00917"></a>00917                                                 <span class="comment">// has been visited before.</span>
<a name="l00918"></a>00918                                                 i=-<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[lp][nu[lp]&lt;&lt;1];
<a name="l00919"></a>00919                                                 <span class="keywordflow">if</span>(i&gt;0) {
<a name="l00920"></a>00920 
<a name="l00921"></a>00921                                                         <span class="comment">// Now see if the last edge of that other</span>
<a name="l00922"></a>00922                                                         <span class="comment">// marginal point actually ends up here.</span>
<a name="l00923"></a>00923                                                         <span class="keywordflow">if</span>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][nu[i]-1]==j) {
<a name="l00924"></a>00924                                                                 new_double_edge=<span class="keyword">true</span>;
<a name="l00925"></a>00925                                                                 k-=1;
<a name="l00926"></a>00926                                                         } <span class="keywordflow">else</span> new_double_edge=<span class="keyword">false</span>;
<a name="l00927"></a>00927                                                 } <span class="keywordflow">else</span> {
<a name="l00928"></a>00928 
<a name="l00929"></a>00929                                                         <span class="comment">// That marginal point hasn&#39;t been visited</span>
<a name="l00930"></a>00930                                                         <span class="comment">// before, so we probably don&#39;t have to worry</span>
<a name="l00931"></a>00931                                                         <span class="comment">// about duplicate edges, except in the</span>
<a name="l00932"></a>00932                                                         <span class="comment">// case when that&#39;s the way into the end</span>
<a name="l00933"></a>00933                                                         <span class="comment">// of the facet, because that way always creates</span>
<a name="l00934"></a>00934                                                         <span class="comment">// an edge.</span>
<a name="l00935"></a>00935                                                         <span class="keywordflow">if</span>(j==rp&amp;&amp;lp==up&amp;&amp;<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[qp][nu[qp]+qs]==us) {
<a name="l00936"></a>00936                                                                 new_double_edge=<span class="keyword">true</span>;
<a name="l00937"></a>00937                                                                 k-=1;
<a name="l00938"></a>00938                                                         } <span class="keywordflow">else</span> new_double_edge=<span class="keyword">false</span>;
<a name="l00939"></a>00939                                                 }
<a name="l00940"></a>00940                                         } <span class="keywordflow">else</span> new_double_edge=<span class="keyword">false</span>;
<a name="l00941"></a>00941                                 } <span class="keywordflow">else</span> {
<a name="l00942"></a>00942 
<a name="l00943"></a>00943                                         <span class="comment">// The vertex hasn&#39;t been visited</span>
<a name="l00944"></a>00944                                         <span class="comment">// before, but let&#39;s see if it&#39;s</span>
<a name="l00945"></a>00945                                         <span class="comment">// marginal</span>
<a name="l00946"></a>00946                                         <span class="keywordflow">if</span>(lw==0) {
<a name="l00947"></a>00947 
<a name="l00948"></a>00948                                                 <span class="comment">// If it is, we need to check</span>
<a name="l00949"></a>00949                                                 <span class="comment">// for the case that it&#39;s a</span>
<a name="l00950"></a>00950                                                 <span class="comment">// small branch, and that we&#39;re</span>
<a name="l00951"></a>00951                                                 <span class="comment">// heading right back to where</span>
<a name="l00952"></a>00952                                                 <span class="comment">// we came from</span>
<a name="l00953"></a>00953                                                 i=-<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[lp][nu[lp]&lt;&lt;1];
<a name="l00954"></a>00954                                                 <span class="keywordflow">if</span>(i==cp) {
<a name="l00955"></a>00955                                                         new_double_edge=<span class="keyword">true</span>;
<a name="l00956"></a>00956                                                         k-=1;
<a name="l00957"></a>00957                                                 } <span class="keywordflow">else</span> new_double_edge=<span class="keyword">false</span>;
<a name="l00958"></a>00958                                         } <span class="keywordflow">else</span> new_double_edge=<span class="keyword">false</span>;
<a name="l00959"></a>00959                                 }
<a name="l00960"></a>00960                         }
<a name="l00961"></a>00961 
<a name="l00962"></a>00962                         <span class="comment">// k now holds the number of edges of the new vertex</span>
<a name="l00963"></a>00963                         <span class="comment">// we are forming. Add memory for it if it doesn&#39;t exist</span>
<a name="l00964"></a>00964                         <span class="comment">// already.</span>
<a name="l00965"></a>00965                         <span class="keywordflow">while</span>(k&gt;=current_vertex_order) add_memory_vorder(vc);
<a name="l00966"></a>00966                         <span class="keywordflow">if</span>(<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[k]==mem[k]) add_memory(vc,k,stackp2);
<a name="l00967"></a>00967 
<a name="l00968"></a>00968                         <span class="comment">// Now create a new vertex with order k, or augment</span>
<a name="l00969"></a>00969                         <span class="comment">// the existing one</span>
<a name="l00970"></a>00970                         <span class="keywordflow">if</span>(j&gt;0) {
<a name="l00971"></a>00971 
<a name="l00972"></a>00972                                 <span class="comment">// If we&#39;re augmenting a vertex but we don&#39;t</span>
<a name="l00973"></a>00973                                 <span class="comment">// actually need any more edges, just skip this</span>
<a name="l00974"></a>00974                                 <span class="comment">// routine to avoid memory confusion</span>
<a name="l00975"></a>00975                                 <span class="keywordflow">if</span>(nu[j]!=k) {
<a name="l00976"></a>00976                                         <span class="comment">// Allocate memory and copy the edges</span>
<a name="l00977"></a>00977                                         <span class="comment">// of the previous instance into it</span>
<a name="l00978"></a>00978                                         vc.n_set_aux1(k);
<a name="l00979"></a>00979                                         edp=<a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[k]+((k&lt;&lt;1)+1)*<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[k]++;
<a name="l00980"></a>00980                                         i=0;
<a name="l00981"></a>00981                                         <span class="keywordflow">while</span>(i&lt;nu[j]) {
<a name="l00982"></a>00982                                                 vc.n_copy_aux1(j,i);
<a name="l00983"></a>00983                                                 edp[i]=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[j][i];
<a name="l00984"></a>00984                                                 edp[k+i]=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[j][nu[j]+i];
<a name="l00985"></a>00985                                                 i++;
<a name="l00986"></a>00986                                         }
<a name="l00987"></a>00987                                         edp[k&lt;&lt;1]=j;
<a name="l00988"></a>00988 
<a name="l00989"></a>00989                                         <span class="comment">// Remove the previous instance with</span>
<a name="l00990"></a>00990                                         <span class="comment">// fewer vertices from the memory</span>
<a name="l00991"></a>00991                                         <span class="comment">// structure</span>
<a name="l00992"></a>00992                                         edd=<a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[nu[j]]+((nu[j]&lt;&lt;1)+1)*--<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[nu[j]];
<a name="l00993"></a>00993                                         <span class="keywordflow">if</span>(edd!=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[j]) {
<a name="l00994"></a>00994                                                 <span class="keywordflow">for</span>(lw=0;lw&lt;=(nu[j]&lt;&lt;1);lw++) <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[j][lw]=edd[lw];
<a name="l00995"></a>00995                                                 vc.n_set_aux2_copy(j,nu[j]);
<a name="l00996"></a>00996                                                 vc.n_copy_pointer(edd[nu[j]&lt;&lt;1],j);
<a name="l00997"></a>00997                                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[edd[nu[j]&lt;&lt;1]]=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[j];
<a name="l00998"></a>00998                                         }
<a name="l00999"></a>00999                                         vc.n_set_to_aux1(j);
<a name="l01000"></a>01000                                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[j]=edp;
<a name="l01001"></a>01001                                 } <span class="keywordflow">else</span> i=nu[j];
<a name="l01002"></a>01002                         } <span class="keywordflow">else</span> {
<a name="l01003"></a>01003 
<a name="l01004"></a>01004                                 <span class="comment">// Allocate a new vertex of order k</span>
<a name="l01005"></a>01005                                 vc.n_set_pointer(<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>,k);
<a name="l01006"></a>01006                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]=<a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[k]+((k&lt;&lt;1)+1)*<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[k]++;
<a name="l01007"></a>01007                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>][k&lt;&lt;1]=<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;
<a name="l01008"></a>01008                                 <span class="keywordflow">if</span>(stackp2==stacke2) add_memory_ds2(stackp2);
<a name="l01009"></a>01009                                 *(stackp2++)=qp;
<a name="l01010"></a>01010                                 <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*qp];
<a name="l01011"></a>01011                                 <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>+1]=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*qp+1];
<a name="l01012"></a>01012                                 <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>+2]=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*qp+2];
<a name="l01013"></a>01013                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[qp][nu[qp]&lt;&lt;1]=-<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;
<a name="l01014"></a>01014                                 j=<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>++;
<a name="l01015"></a>01015                                 i=0;
<a name="l01016"></a>01016                         }
<a name="l01017"></a>01017                         nu[j]=k;
<a name="l01018"></a>01018 
<a name="l01019"></a>01019                         <span class="comment">// Unless the previous case was a double edge, connect</span>
<a name="l01020"></a>01020                         <span class="comment">// the first available edge of the new vertex to the</span>
<a name="l01021"></a>01021                         <span class="comment">// last one in the facet</span>
<a name="l01022"></a>01022                         <span class="keywordflow">if</span>(!double_edge) {
<a name="l01023"></a>01023                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[j][i]=cp;
<a name="l01024"></a>01024                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[j][nu[j]+i]=cs;
<a name="l01025"></a>01025                                 vc.n_set(j,i,p_id);
<a name="l01026"></a>01026                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[cp][cs]=j;
<a name="l01027"></a>01027                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[cp][nu[cp]+cs]=i;
<a name="l01028"></a>01028                                 i++;
<a name="l01029"></a>01029                         }
<a name="l01030"></a>01030 
<a name="l01031"></a>01031                         <span class="comment">// Copy in the edges of the underlying vertex,</span>
<a name="l01032"></a>01032                         <span class="comment">// and do one less if this was a double edge</span>
<a name="l01033"></a>01033                         qs=iqs;
<a name="l01034"></a>01034                         <span class="keywordflow">while</span>(i&lt;(new_double_edge?k:k-1)) {
<a name="l01035"></a>01035                                 qs=<a class="code" href="classvoro_1_1voronoicell__base.html#a1d86762311d8860960a45cc409b14f0f">cycle_up</a>(qs,qp);
<a name="l01036"></a>01036                                 lp=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[qp][qs];ls=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[qp][nu[qp]+qs];
<a name="l01037"></a>01037                                 vc.n_copy(j,i,qp,qs);
<a name="l01038"></a>01038                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[j][i]=lp;
<a name="l01039"></a>01039                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[j][nu[j]+i]=ls;
<a name="l01040"></a>01040                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[lp][ls]=j;
<a name="l01041"></a>01041                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[lp][nu[lp]+ls]=i;
<a name="l01042"></a>01042                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[qp][qs]=-1;
<a name="l01043"></a>01043                                 i++;
<a name="l01044"></a>01044                         }
<a name="l01045"></a>01045                         qs=<a class="code" href="classvoro_1_1voronoicell__base.html#a1d86762311d8860960a45cc409b14f0f">cycle_up</a>(qs,qp);
<a name="l01046"></a>01046                         cs=i;
<a name="l01047"></a>01047                         cp=j;
<a name="l01048"></a>01048                         vc.n_copy(j,new_double_edge?0:cs,qp,qs);
<a name="l01049"></a>01049 
<a name="l01050"></a>01050                         <span class="comment">// Update the double_edge flag, to pass it</span>
<a name="l01051"></a>01051                         <span class="comment">// to the next instance of this routine</span>
<a name="l01052"></a>01052                         double_edge=new_double_edge;
<a name="l01053"></a>01053                 }
<a name="l01054"></a>01054         }
<a name="l01055"></a>01055 
<a name="l01056"></a>01056         <span class="comment">// Connect the final created vertex to the initial one</span>
<a name="l01057"></a>01057         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[cp][cs]=rp;
<a name="l01058"></a>01058         *<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[rp]=cp;
<a name="l01059"></a>01059         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[cp][nu[cp]+cs]=0;
<a name="l01060"></a>01060         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[rp][nu[rp]]=cs;
<a name="l01061"></a>01061 
<a name="l01062"></a>01062         <span class="comment">// Delete points: first, remove any duplicates</span>
<a name="l01063"></a>01063         dsp=ds;
<a name="l01064"></a>01064         <span class="keywordflow">while</span>(dsp&lt;stackp) {
<a name="l01065"></a>01065                 j=*dsp;
<a name="l01066"></a>01066                 <span class="keywordflow">if</span>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[j][nu[j]]!=-1) {
<a name="l01067"></a>01067                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[j][nu[j]]=-1;
<a name="l01068"></a>01068                         dsp++;
<a name="l01069"></a>01069                 } <span class="keywordflow">else</span> *dsp=*(--stackp);
<a name="l01070"></a>01070         }
<a name="l01071"></a>01071 
<a name="l01072"></a>01072         <span class="comment">// Add the points in the auxiliary delete stack,</span>
<a name="l01073"></a>01073         <span class="comment">// and reset their back pointers</span>
<a name="l01074"></a>01074         <span class="keywordflow">for</span>(dsp=ds2;dsp&lt;stackp2;dsp++) {
<a name="l01075"></a>01075                 j=*dsp;
<a name="l01076"></a>01076                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[j][nu[j]&lt;&lt;1]=j;
<a name="l01077"></a>01077                 <span class="keywordflow">if</span>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[j][nu[j]]!=-1) {
<a name="l01078"></a>01078                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[j][nu[j]]=-1;
<a name="l01079"></a>01079                         <span class="keywordflow">if</span>(stackp==stacke) add_memory_ds(stackp);
<a name="l01080"></a>01080                         *(stackp++)=j;
<a name="l01081"></a>01081                 }
<a name="l01082"></a>01082         }
<a name="l01083"></a>01083 
<a name="l01084"></a>01084         <span class="comment">// Scan connections and add in extras</span>
<a name="l01085"></a>01085         <span class="keywordflow">for</span>(dsp=ds;dsp&lt;stackp;dsp++) {
<a name="l01086"></a>01086                 cp=*dsp;
<a name="l01087"></a>01087                 <span class="keywordflow">for</span>(edp=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[cp];edp&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[cp]+nu[cp];edp++) {
<a name="l01088"></a>01088                         qp=*edp;
<a name="l01089"></a>01089                         <span class="keywordflow">if</span>(qp!=-1) {
<a name="l01090"></a>01090                                 <span class="keywordflow">if</span>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[qp][nu[qp]]!=-1) {
<a name="l01091"></a>01091                                         <span class="keywordflow">if</span>(stackp==stacke) add_memory_ds(stackp);
<a name="l01092"></a>01092                                         *(stackp++)=qp;
<a name="l01093"></a>01093                                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[qp][nu[qp]]=-1;
<a name="l01094"></a>01094                                 }
<a name="l01095"></a>01095                         }
<a name="l01096"></a>01096                 }
<a name="l01097"></a>01097         }
<a name="l01098"></a>01098         up=0;
<a name="l01099"></a>01099 
<a name="l01100"></a>01100         <span class="comment">// Delete them from the array structure</span>
<a name="l01101"></a>01101         <span class="keywordflow">while</span>(stackp&gt;ds) {
<a name="l01102"></a>01102                 --<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;
<a name="l01103"></a>01103                 <span class="keywordflow">while</span>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>][nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]]==-1) {
<a name="l01104"></a>01104                         j=nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>];
<a name="l01105"></a>01105                         edp=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>];edd=(<a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[j]+((j&lt;&lt;1)+1)*--<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[j]);
<a name="l01106"></a>01106                         <span class="keywordflow">while</span>(edp&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]+(j&lt;&lt;1)+1) *(edp++)=*(edd++);
<a name="l01107"></a>01107                         vc.n_set_aux2_copy(<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>,j);
<a name="l01108"></a>01108                         vc.n_copy_pointer(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>][(j&lt;&lt;1)],<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>);
<a name="l01109"></a>01109                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>][(j&lt;&lt;1)]]=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>];
<a name="l01110"></a>01110                         --<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;
<a name="l01111"></a>01111                 }
<a name="l01112"></a>01112                 up=*(--stackp);
<a name="l01113"></a>01113                 <span class="keywordflow">if</span>(up&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>) {
<a name="l01114"></a>01114 
<a name="l01115"></a>01115                         <span class="comment">// Vertex management</span>
<a name="l01116"></a>01116                         <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>]=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>];
<a name="l01117"></a>01117                         <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*up+1]=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>+1];
<a name="l01118"></a>01118                         <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*up+2]=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>+2];
<a name="l01119"></a>01119 
<a name="l01120"></a>01120                         <span class="comment">// Memory management</span>
<a name="l01121"></a>01121                         j=nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>];
<a name="l01122"></a>01122                         edp=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>];edd=(<a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[j]+((j&lt;&lt;1)+1)*--<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[j]);
<a name="l01123"></a>01123                         <span class="keywordflow">while</span>(edp&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[up]+(j&lt;&lt;1)+1) *(edp++)=*(edd++);
<a name="l01124"></a>01124                         vc.n_set_aux2_copy(up,j);
<a name="l01125"></a>01125                         vc.n_copy_pointer(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[up][j&lt;&lt;1],up);
<a name="l01126"></a>01126                         vc.n_copy_pointer(up,<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>);
<a name="l01127"></a>01127                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][j&lt;&lt;1]]=ed[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>];
<a name="l01128"></a>01128 
<a name="l01129"></a>01129                         <span class="comment">// Edge management</span>
<a name="l01130"></a>01130                         ed[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>]=ed[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>];
<a name="l01131"></a>01131                         nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>]=nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>];
<a name="l01132"></a>01132                         <span class="keywordflow">for</span>(i=0;i&lt;nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>];i++) ed[ed[up][i]][ed[up][nu[up]+i]]=up;
<a name="l01133"></a>01133                         ed[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>]&lt;&lt;1]=<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>;
<a name="l01134"></a>01134                 } <span class="keywordflow">else</span> up=<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>++;
<a name="l01135"></a>01135         }
<a name="l01136"></a>01136 
<a name="l01137"></a>01137         <span class="comment">// Check for any vertices of zero order</span>
<a name="l01138"></a>01138         <span class="keywordflow">if</span>(*<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>&gt;0) voro_fatal_error(<span class="stringliteral">&quot;Zero order vertex formed&quot;</span>,<a class="code" href="config_8hh.html#ad8e0de9d48da06e86dd87884e4a2d47e">VOROPP_INTERNAL_ERROR</a>);
<a name="l01139"></a>01139 
<a name="l01140"></a>01140         <span class="comment">// Collapse any order 2 vertices and exit</span>
<a name="l01141"></a>01141         <span class="keywordflow">return</span> collapse_order2(vc);
<a name="l01142"></a>01142 }
<a name="l01143"></a>01143 <span class="comment"></span>
<a name="l01144"></a>01144 <span class="comment">/** During the creation of a new facet in the plane routine, it is possible</span>
<a name="l01145"></a>01145 <span class="comment"> * that some order two vertices may arise. This routine removes them.</span>
<a name="l01146"></a>01146 <span class="comment"> * Suppose an order two vertex joins c and d. If there&#39;s a edge between</span>
<a name="l01147"></a>01147 <span class="comment"> * c and d already, then the order two vertex is just removed; otherwise,</span>
<a name="l01148"></a>01148 <span class="comment"> * the order two vertex is removed and c and d are joined together directly.</span>
<a name="l01149"></a>01149 <span class="comment"> * It is possible this process will create order two or order one vertices,</span>
<a name="l01150"></a>01150 <span class="comment"> * and the routine is continually run until all of them are removed.</span>
<a name="l01151"></a>01151 <span class="comment"> * \return False if the vertex removal was unsuccessful, indicative of the cell</span>
<a name="l01152"></a>01152 <span class="comment"> *         reducing to zero volume and disappearing; true if the vertex removal</span>
<a name="l01153"></a>01153 <span class="comment"> *         was successful. */</span>
<a name="l01154"></a>01154 <span class="keyword">template</span>&lt;<span class="keyword">class</span> vc_<span class="keyword">class</span>&gt;
<a name="l01155"></a>01155 <span class="keyword">inline</span> <span class="keywordtype">bool</span> voronoicell_base::collapse_order2(vc_class &amp;vc) {
<a name="l01156"></a>01156         <span class="keywordflow">if</span>(!collapse_order1(vc)) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l01157"></a>01157         <span class="keywordtype">int</span> a,b,i,j,k,l;
<a name="l01158"></a>01158         <span class="keywordflow">while</span>(<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[2]&gt;0) {
<a name="l01159"></a>01159 
<a name="l01160"></a>01160                 <span class="comment">// Pick a order 2 vertex and read in its edges</span>
<a name="l01161"></a>01161                 i=--<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[2];
<a name="l01162"></a>01162                 j=<a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[2][5*i];k=<a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[2][5*i+1];
<a name="l01163"></a>01163                 <span class="keywordflow">if</span>(j==k) {
<a name="l01164"></a>01164 <span class="preprocessor">#if VOROPP_VERBOSE &gt;=1</span>
<a name="l01165"></a>01165 <span class="preprocessor"></span>                        fputs(<span class="stringliteral">&quot;Order two vertex joins itself&quot;</span>,stderr);
<a name="l01166"></a>01166 <span class="preprocessor">#endif</span>
<a name="l01167"></a>01167 <span class="preprocessor"></span>                        <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l01168"></a>01168                 }
<a name="l01169"></a>01169 
<a name="l01170"></a>01170                 <span class="comment">// Scan the edges of j to see if joins k</span>
<a name="l01171"></a>01171                 <span class="keywordflow">for</span>(l=0;l&lt;nu[j];l++) {
<a name="l01172"></a>01172                         <span class="keywordflow">if</span>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[j][l]==k) <span class="keywordflow">break</span>;
<a name="l01173"></a>01173                 }
<a name="l01174"></a>01174 
<a name="l01175"></a>01175                 <span class="comment">// If j doesn&#39;t already join k, join them together.</span>
<a name="l01176"></a>01176                 <span class="comment">// Otherwise delete the connection to the current</span>
<a name="l01177"></a>01177                 <span class="comment">// vertex from j and k.</span>
<a name="l01178"></a>01178                 a=<a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[2][5*i+2];b=<a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[2][5*i+3];i=<a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[2][5*i+4];
<a name="l01179"></a>01179                 <span class="keywordflow">if</span>(l==nu[j]) {
<a name="l01180"></a>01180                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[j][a]=k;
<a name="l01181"></a>01181                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][b]=j;
<a name="l01182"></a>01182                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[j][nu[j]+a]=b;
<a name="l01183"></a>01183                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][nu[k]+b]=a;
<a name="l01184"></a>01184                 } <span class="keywordflow">else</span> {
<a name="l01185"></a>01185                         <span class="keywordflow">if</span>(!delete_connection(vc,j,a,<span class="keyword">false</span>)) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l01186"></a>01186                         <span class="keywordflow">if</span>(!delete_connection(vc,k,b,<span class="keyword">true</span>)) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l01187"></a>01187                 }
<a name="l01188"></a>01188 
<a name="l01189"></a>01189                 <span class="comment">// Compact the memory</span>
<a name="l01190"></a>01190                 --<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;
<a name="l01191"></a>01191                 <span class="keywordflow">if</span>(up==i) up=0;
<a name="l01192"></a>01192                 <span class="keywordflow">if</span>(<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>!=i) {
<a name="l01193"></a>01193                         <span class="keywordflow">if</span>(up==<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>) up=i;
<a name="l01194"></a>01194                         <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*i]=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>];
<a name="l01195"></a>01195                         <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*i+1]=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>+1];
<a name="l01196"></a>01196                         <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*i+2]=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>+2];
<a name="l01197"></a>01197                         <span class="keywordflow">for</span>(k=0;k&lt;nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>];k++) <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>][k]][<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>][nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]+k]]=i;
<a name="l01198"></a>01198                         vc.n_copy_pointer(i,<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>);
<a name="l01199"></a>01199                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i]=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>];
<a name="l01200"></a>01200                         nu[i]=nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>];
<a name="l01201"></a>01201                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][nu[i]&lt;&lt;1]=i;
<a name="l01202"></a>01202                 }
<a name="l01203"></a>01203 
<a name="l01204"></a>01204                 <span class="comment">// Collapse any order 1 vertices if they were created</span>
<a name="l01205"></a>01205                 <span class="keywordflow">if</span>(!collapse_order1(vc)) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l01206"></a>01206         }
<a name="l01207"></a>01207         <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l01208"></a>01208 }
<a name="l01209"></a>01209 <span class="comment"></span>
<a name="l01210"></a>01210 <span class="comment">/** Order one vertices can potentially be created during the order two collapse</span>
<a name="l01211"></a>01211 <span class="comment"> * routine. This routine keeps removing them until there are none left.</span>
<a name="l01212"></a>01212 <span class="comment"> * \return False if the vertex removal was unsuccessful, indicative of the cell</span>
<a name="l01213"></a>01213 <span class="comment"> *         having zero volume and disappearing; true if the vertex removal was</span>
<a name="l01214"></a>01214 <span class="comment"> *         successful. */</span>
<a name="l01215"></a>01215 <span class="keyword">template</span>&lt;<span class="keyword">class</span> vc_<span class="keyword">class</span>&gt;
<a name="l01216"></a>01216 <span class="keyword">inline</span> <span class="keywordtype">bool</span> voronoicell_base::collapse_order1(vc_class &amp;vc) {
<a name="l01217"></a>01217         <span class="keywordtype">int</span> i,j,k;
<a name="l01218"></a>01218         <span class="keywordflow">while</span>(<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[1]&gt;0) {
<a name="l01219"></a>01219                 up=0;
<a name="l01220"></a>01220 <span class="preprocessor">#if VOROPP_VERBOSE &gt;=1</span>
<a name="l01221"></a>01221 <span class="preprocessor"></span>                fputs(<span class="stringliteral">&quot;Order one collapse\n&quot;</span>,stderr);
<a name="l01222"></a>01222 <span class="preprocessor">#endif</span>
<a name="l01223"></a>01223 <span class="preprocessor"></span>                i=--<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[1];
<a name="l01224"></a>01224                 j=<a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[1][3*i];k=<a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[1][3*i+1];
<a name="l01225"></a>01225                 i=<a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[1][3*i+2];
<a name="l01226"></a>01226                 <span class="keywordflow">if</span>(!delete_connection(vc,j,k,<span class="keyword">false</span>)) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l01227"></a>01227                 --<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;
<a name="l01228"></a>01228                 <span class="keywordflow">if</span>(up==i) up=0;
<a name="l01229"></a>01229                 <span class="keywordflow">if</span>(<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>!=i) {
<a name="l01230"></a>01230                         <span class="keywordflow">if</span>(up==<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>) up=i;
<a name="l01231"></a>01231                         <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*i]=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>];
<a name="l01232"></a>01232                         <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*i+1]=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>+1];
<a name="l01233"></a>01233                         <a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*i+2]=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>+2];
<a name="l01234"></a>01234                         <span class="keywordflow">for</span>(k=0;k&lt;nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>];k++) <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>][k]][<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>][nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>]+k]]=i;
<a name="l01235"></a>01235                         vc.n_copy_pointer(i,<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>);
<a name="l01236"></a>01236                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i]=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>];
<a name="l01237"></a>01237                         nu[i]=nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>];
<a name="l01238"></a>01238                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][nu[i]&lt;&lt;1]=i;
<a name="l01239"></a>01239                 }
<a name="l01240"></a>01240         }
<a name="l01241"></a>01241         <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l01242"></a>01242 }
<a name="l01243"></a>01243 <span class="comment"></span>
<a name="l01244"></a>01244 <span class="comment">/** This routine deletes the kth edge of vertex j and reorganizes the memory.</span>
<a name="l01245"></a>01245 <span class="comment"> * If the neighbor computation is enabled, we also have to supply an handedness</span>
<a name="l01246"></a>01246 <span class="comment"> * flag to decide whether to preserve the plane on the left or right of the</span>
<a name="l01247"></a>01247 <span class="comment"> * connection.</span>
<a name="l01248"></a>01248 <span class="comment"> * \return False if a zero order vertex was formed, indicative of the cell</span>
<a name="l01249"></a>01249 <span class="comment"> *         disappearing; true if the vertex removal was successful. */</span>
<a name="l01250"></a>01250 <span class="keyword">template</span>&lt;<span class="keyword">class</span> vc_<span class="keyword">class</span>&gt;
<a name="l01251"></a>01251 <span class="keyword">inline</span> <span class="keywordtype">bool</span> voronoicell_base::delete_connection(vc_class &amp;vc,<span class="keywordtype">int</span> j,<span class="keywordtype">int</span> k,<span class="keywordtype">bool</span> hand) {
<a name="l01252"></a>01252         <span class="keywordtype">int</span> q=hand?k:<a class="code" href="classvoro_1_1voronoicell__base.html#a1d86762311d8860960a45cc409b14f0f">cycle_up</a>(k,j);
<a name="l01253"></a>01253         <span class="keywordtype">int</span> i=nu[j]-1,l,*edp,*edd,m;
<a name="l01254"></a>01254 <span class="preprocessor">#if VOROPP_VERBOSE &gt;=1</span>
<a name="l01255"></a>01255 <span class="preprocessor"></span>        <span class="keywordflow">if</span>(i&lt;1) {
<a name="l01256"></a>01256                 fputs(<span class="stringliteral">&quot;Zero order vertex formed\n&quot;</span>,stderr);
<a name="l01257"></a>01257                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l01258"></a>01258         }
<a name="l01259"></a>01259 <span class="preprocessor">#endif</span>
<a name="l01260"></a>01260 <span class="preprocessor"></span>        <span class="keywordflow">if</span>(<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[i]==mem[i]) add_memory(vc,i,ds2);
<a name="l01261"></a>01261         vc.n_set_aux1(i);
<a name="l01262"></a>01262         <span class="keywordflow">for</span>(l=0;l&lt;q;l++) vc.n_copy_aux1(j,l);
<a name="l01263"></a>01263         <span class="keywordflow">while</span>(l&lt;i) {
<a name="l01264"></a>01264                 vc.n_copy_aux1_shift(j,l);
<a name="l01265"></a>01265                 l++;
<a name="l01266"></a>01266         }
<a name="l01267"></a>01267         edp=<a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[i]+((i&lt;&lt;1)+1)*<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[i]++;
<a name="l01268"></a>01268         edp[i&lt;&lt;1]=j;
<a name="l01269"></a>01269         <span class="keywordflow">for</span>(l=0;l&lt;k;l++) {
<a name="l01270"></a>01270                 edp[l]=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[j][l];
<a name="l01271"></a>01271                 edp[l+i]=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[j][l+nu[j]];
<a name="l01272"></a>01272         }
<a name="l01273"></a>01273         <span class="keywordflow">while</span>(l&lt;i) {
<a name="l01274"></a>01274                 m=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[j][l+1];
<a name="l01275"></a>01275                 edp[l]=m;
<a name="l01276"></a>01276                 k=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[j][l+nu[j]+1];
<a name="l01277"></a>01277                 edp[l+i]=k;
<a name="l01278"></a>01278                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[m][nu[m]+k]--;
<a name="l01279"></a>01279                 l++;
<a name="l01280"></a>01280         }
<a name="l01281"></a>01281 
<a name="l01282"></a>01282         edd=<a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[nu[j]]+((nu[j]&lt;&lt;1)+1)*--<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[nu[j]];
<a name="l01283"></a>01283         <span class="keywordflow">for</span>(l=0;l&lt;=(nu[j]&lt;&lt;1);l++) <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[j][l]=edd[l];
<a name="l01284"></a>01284         vc.n_set_aux2_copy(j,nu[j]);
<a name="l01285"></a>01285         vc.n_set_to_aux2(edd[nu[j]&lt;&lt;1]);
<a name="l01286"></a>01286         vc.n_set_to_aux1(j);
<a name="l01287"></a>01287         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[edd[nu[j]&lt;&lt;1]]=edd;
<a name="l01288"></a>01288         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[j]=edp;
<a name="l01289"></a>01289         nu[j]=i;
<a name="l01290"></a>01290         <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l01291"></a>01291 }
<a name="l01292"></a>01292 <span class="comment"></span>
<a name="l01293"></a>01293 <span class="comment">/** Calculates the volume of the Voronoi cell, by decomposing the cell into</span>
<a name="l01294"></a>01294 <span class="comment"> * tetrahedra extending outward from the zeroth vertex, whose volumes are</span>
<a name="l01295"></a>01295 <span class="comment"> * evaluated using a scalar triple product.</span>
<a name="l01296"></a>01296 <span class="comment"> * \return A floating point number holding the calculated volume. */</span>
<a name="l01297"></a><a class="code" href="classvoro_1_1voronoicell__base.html#a92f69986a6f78e7b8b6d9f5778ed99ba">01297</a> <span class="keywordtype">double</span> <a class="code" href="classvoro_1_1voronoicell__base.html#a92f69986a6f78e7b8b6d9f5778ed99ba">voronoicell_base::volume</a>() {
<a name="l01298"></a>01298         <span class="keyword">const</span> <span class="keywordtype">double</span> fe=1/48.0;
<a name="l01299"></a>01299         <span class="keywordtype">double</span> vol=0;
<a name="l01300"></a>01300         <span class="keywordtype">int</span> i,j,k,l,m,n;
<a name="l01301"></a>01301         <span class="keywordtype">double</span> ux,uy,uz,vx,vy,vz,wx,wy,wz;
<a name="l01302"></a>01302         <span class="keywordflow">for</span>(i=1;i&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;i++) {
<a name="l01303"></a>01303                 ux=*<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>-<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*i];
<a name="l01304"></a>01304                 uy=pts[1]-pts[3*i+1];
<a name="l01305"></a>01305                 uz=pts[2]-pts[3*i+2];
<a name="l01306"></a>01306                 <span class="keywordflow">for</span>(j=0;j&lt;nu[i];j++) {
<a name="l01307"></a>01307                         k=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j];
<a name="l01308"></a>01308                         <span class="keywordflow">if</span>(k&gt;=0) {
<a name="l01309"></a>01309                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j]=-1-k;
<a name="l01310"></a>01310                                 l=<a class="code" href="classvoro_1_1voronoicell__base.html#a1d86762311d8860960a45cc409b14f0f">cycle_up</a>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][nu[i]+j],k);
<a name="l01311"></a>01311                                 vx=pts[3*k]-*<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>;
<a name="l01312"></a>01312                                 vy=pts[3*k+1]-pts[1];
<a name="l01313"></a>01313                                 vz=pts[3*k+2]-pts[2];
<a name="l01314"></a>01314                                 m=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l];<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l]=-1-m;
<a name="l01315"></a>01315                                 <span class="keywordflow">while</span>(m!=i) {
<a name="l01316"></a>01316                                         n=<a class="code" href="classvoro_1_1voronoicell__base.html#a1d86762311d8860960a45cc409b14f0f">cycle_up</a>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][nu[k]+l],m);
<a name="l01317"></a>01317                                         wx=pts[3*m]-*<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>;
<a name="l01318"></a>01318                                         wy=pts[3*m+1]-pts[1];
<a name="l01319"></a>01319                                         wz=pts[3*m+2]-pts[2];
<a name="l01320"></a>01320                                         vol+=ux*vy*wz+uy*vz*wx+uz*vx*wy-uz*vy*wx-uy*vx*wz-ux*vz*wy;
<a name="l01321"></a>01321                                         k=m;l=n;vx=wx;vy=wy;vz=wz;
<a name="l01322"></a>01322                                         m=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l];<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l]=-1-m;
<a name="l01323"></a>01323                                 }
<a name="l01324"></a>01324                         }
<a name="l01325"></a>01325                 }
<a name="l01326"></a>01326         }
<a name="l01327"></a>01327         <a class="code" href="classvoro_1_1voronoicell__base.html#a5d09c9e36ad159fcd23cfef8855cae61">reset_edges</a>();
<a name="l01328"></a>01328         <span class="keywordflow">return</span> vol*fe;
<a name="l01329"></a>01329 }
<a name="l01330"></a>01330 <span class="comment"></span>
<a name="l01331"></a>01331 <span class="comment">/** Calculates the areas of each face of the Voronoi cell and prints the</span>
<a name="l01332"></a>01332 <span class="comment"> * results to an output stream.</span>
<a name="l01333"></a>01333 <span class="comment"> * \param[out] v the vector to store the results in. */</span>
<a name="l01334"></a><a class="code" href="classvoro_1_1voronoicell__base.html#a5e2628315bfb924f7013c3efee689d72">01334</a> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__base.html#a5e2628315bfb924f7013c3efee689d72">voronoicell_base::face_areas</a>(vector&lt;double&gt; &amp;v) {
<a name="l01335"></a>01335         <span class="keywordtype">double</span> area;
<a name="l01336"></a>01336         v.clear();
<a name="l01337"></a>01337         <span class="keywordtype">int</span> i,j,k,l,m,n;
<a name="l01338"></a>01338         <span class="keywordtype">double</span> ux,uy,uz,vx,vy,vz,wx,wy,wz;
<a name="l01339"></a>01339         <span class="keywordflow">for</span>(i=1;i&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;i++) <span class="keywordflow">for</span>(j=0;j&lt;nu[i];j++) {
<a name="l01340"></a>01340                 k=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j];
<a name="l01341"></a>01341                 <span class="keywordflow">if</span>(k&gt;=0) {
<a name="l01342"></a>01342                         area=0;
<a name="l01343"></a>01343                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j]=-1-k;
<a name="l01344"></a>01344                         l=<a class="code" href="classvoro_1_1voronoicell__base.html#a1d86762311d8860960a45cc409b14f0f">cycle_up</a>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][nu[i]+j],k);
<a name="l01345"></a>01345                         m=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l];<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l]=-1-m;
<a name="l01346"></a>01346                         <span class="keywordflow">while</span>(m!=i) {
<a name="l01347"></a>01347                                 n=<a class="code" href="classvoro_1_1voronoicell__base.html#a1d86762311d8860960a45cc409b14f0f">cycle_up</a>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][nu[k]+l],m);
<a name="l01348"></a>01348                                 ux=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*k]-<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*i];
<a name="l01349"></a>01349                                 uy=pts[3*k+1]-pts[3*i+1];
<a name="l01350"></a>01350                                 uz=pts[3*k+2]-pts[3*i+2];
<a name="l01351"></a>01351                                 vx=pts[3*m]-pts[3*i];
<a name="l01352"></a>01352                                 vy=pts[3*m+1]-pts[3*i+1];
<a name="l01353"></a>01353                                 vz=pts[3*m+2]-pts[3*i+2];
<a name="l01354"></a>01354                                 wx=uy*vz-uz*vy;
<a name="l01355"></a>01355                                 wy=uz*vx-ux*vz;
<a name="l01356"></a>01356                                 wz=ux*vy-uy*vx;
<a name="l01357"></a>01357                                 area+=sqrt(wx*wx+wy*wy+wz*wz);
<a name="l01358"></a>01358                                 k=m;l=n;
<a name="l01359"></a>01359                                 m=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l];<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l]=-1-m;
<a name="l01360"></a>01360                         }
<a name="l01361"></a>01361                         v.push_back(0.125*area);
<a name="l01362"></a>01362                 }
<a name="l01363"></a>01363         }
<a name="l01364"></a>01364         <a class="code" href="classvoro_1_1voronoicell__base.html#a5d09c9e36ad159fcd23cfef8855cae61">reset_edges</a>();
<a name="l01365"></a>01365 }
<a name="l01366"></a>01366 
<a name="l01367"></a>01367 <span class="comment"></span>
<a name="l01368"></a>01368 <span class="comment">/** Calculates the total surface area of the Voronoi cell.</span>
<a name="l01369"></a>01369 <span class="comment"> * \return The computed area. */</span>
<a name="l01370"></a><a class="code" href="classvoro_1_1voronoicell__base.html#af1a68eea414a0a52b072005af7bd710a">01370</a> <span class="keywordtype">double</span> <a class="code" href="classvoro_1_1voronoicell__base.html#af1a68eea414a0a52b072005af7bd710a">voronoicell_base::surface_area</a>() {
<a name="l01371"></a>01371         <span class="keywordtype">double</span> area=0;
<a name="l01372"></a>01372         <span class="keywordtype">int</span> i,j,k,l,m,n;
<a name="l01373"></a>01373         <span class="keywordtype">double</span> ux,uy,uz,vx,vy,vz,wx,wy,wz;
<a name="l01374"></a>01374         <span class="keywordflow">for</span>(i=1;i&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;i++) <span class="keywordflow">for</span>(j=0;j&lt;nu[i];j++) {
<a name="l01375"></a>01375                 k=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j];
<a name="l01376"></a>01376                 <span class="keywordflow">if</span>(k&gt;=0) {
<a name="l01377"></a>01377                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j]=-1-k;
<a name="l01378"></a>01378                         l=<a class="code" href="classvoro_1_1voronoicell__base.html#a1d86762311d8860960a45cc409b14f0f">cycle_up</a>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][nu[i]+j],k);
<a name="l01379"></a>01379                         m=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l];<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l]=-1-m;
<a name="l01380"></a>01380                         <span class="keywordflow">while</span>(m!=i) {
<a name="l01381"></a>01381                                 n=<a class="code" href="classvoro_1_1voronoicell__base.html#a1d86762311d8860960a45cc409b14f0f">cycle_up</a>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][nu[k]+l],m);
<a name="l01382"></a>01382                                 ux=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*k]-<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*i];
<a name="l01383"></a>01383                                 uy=pts[3*k+1]-pts[3*i+1];
<a name="l01384"></a>01384                                 uz=pts[3*k+2]-pts[3*i+2];
<a name="l01385"></a>01385                                 vx=pts[3*m]-pts[3*i];
<a name="l01386"></a>01386                                 vy=pts[3*m+1]-pts[3*i+1];
<a name="l01387"></a>01387                                 vz=pts[3*m+2]-pts[3*i+2];
<a name="l01388"></a>01388                                 wx=uy*vz-uz*vy;
<a name="l01389"></a>01389                                 wy=uz*vx-ux*vz;
<a name="l01390"></a>01390                                 wz=ux*vy-uy*vx;
<a name="l01391"></a>01391                                 area+=sqrt(wx*wx+wy*wy+wz*wz);
<a name="l01392"></a>01392                                 k=m;l=n;
<a name="l01393"></a>01393                                 m=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l];<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l]=-1-m;
<a name="l01394"></a>01394                         }
<a name="l01395"></a>01395                 }
<a name="l01396"></a>01396         }
<a name="l01397"></a>01397         <a class="code" href="classvoro_1_1voronoicell__base.html#a5d09c9e36ad159fcd23cfef8855cae61">reset_edges</a>();
<a name="l01398"></a>01398         <span class="keywordflow">return</span> 0.125*area;
<a name="l01399"></a>01399 }
<a name="l01400"></a>01400 
<a name="l01401"></a>01401 <span class="comment"></span>
<a name="l01402"></a>01402 <span class="comment">/** Calculates the centroid of the Voronoi cell, by decomposing the cell into</span>
<a name="l01403"></a>01403 <span class="comment"> * tetrahedra extending outward from the zeroth vertex.</span>
<a name="l01404"></a>01404 <span class="comment"> * \param[out] (cx,cy,cz) references to floating point numbers in which to</span>
<a name="l01405"></a>01405 <span class="comment"> *                        pass back the centroid vector. */</span>
<a name="l01406"></a><a class="code" href="classvoro_1_1voronoicell__base.html#a7ea57c92bba3110da745381c5877cec3">01406</a> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__base.html#a7ea57c92bba3110da745381c5877cec3">voronoicell_base::centroid</a>(<span class="keywordtype">double</span> &amp;cx,<span class="keywordtype">double</span> &amp;cy,<span class="keywordtype">double</span> &amp;cz) {
<a name="l01407"></a>01407         <span class="keywordtype">double</span> tvol,vol=0;cx=cy=cz=0;
<a name="l01408"></a>01408         <span class="keywordtype">int</span> i,j,k,l,m,n;
<a name="l01409"></a>01409         <span class="keywordtype">double</span> ux,uy,uz,vx,vy,vz,wx,wy,wz;
<a name="l01410"></a>01410         <span class="keywordflow">for</span>(i=1;i&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;i++) {
<a name="l01411"></a>01411                 ux=*<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>-<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*i];
<a name="l01412"></a>01412                 uy=pts[1]-pts[3*i+1];
<a name="l01413"></a>01413                 uz=pts[2]-pts[3*i+2];
<a name="l01414"></a>01414                 <span class="keywordflow">for</span>(j=0;j&lt;nu[i];j++) {
<a name="l01415"></a>01415                         k=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j];
<a name="l01416"></a>01416                         <span class="keywordflow">if</span>(k&gt;=0) {
<a name="l01417"></a>01417                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j]=-1-k;
<a name="l01418"></a>01418                                 l=<a class="code" href="classvoro_1_1voronoicell__base.html#a1d86762311d8860960a45cc409b14f0f">cycle_up</a>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][nu[i]+j],k);
<a name="l01419"></a>01419                                 vx=pts[3*k]-*<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>;
<a name="l01420"></a>01420                                 vy=pts[3*k+1]-pts[1];
<a name="l01421"></a>01421                                 vz=pts[3*k+2]-pts[2];
<a name="l01422"></a>01422                                 m=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l];<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l]=-1-m;
<a name="l01423"></a>01423                                 <span class="keywordflow">while</span>(m!=i) {
<a name="l01424"></a>01424                                         n=<a class="code" href="classvoro_1_1voronoicell__base.html#a1d86762311d8860960a45cc409b14f0f">cycle_up</a>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][nu[k]+l],m);
<a name="l01425"></a>01425                                         wx=pts[3*m]-*<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>;
<a name="l01426"></a>01426                                         wy=pts[3*m+1]-pts[1];
<a name="l01427"></a>01427                                         wz=pts[3*m+2]-pts[2];
<a name="l01428"></a>01428                                         tvol=ux*vy*wz+uy*vz*wx+uz*vx*wy-uz*vy*wx-uy*vx*wz-ux*vz*wy;
<a name="l01429"></a>01429                                         vol+=tvol;
<a name="l01430"></a>01430                                         cx+=(wx+vx-ux)*tvol;
<a name="l01431"></a>01431                                         cy+=(wy+vy-uy)*tvol;
<a name="l01432"></a>01432                                         cz+=(wz+vz-uz)*tvol;
<a name="l01433"></a>01433                                         k=m;l=n;vx=wx;vy=wy;vz=wz;
<a name="l01434"></a>01434                                         m=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l];<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l]=-1-m;
<a name="l01435"></a>01435                                 }
<a name="l01436"></a>01436                         }
<a name="l01437"></a>01437                 }
<a name="l01438"></a>01438         }
<a name="l01439"></a>01439         <a class="code" href="classvoro_1_1voronoicell__base.html#a5d09c9e36ad159fcd23cfef8855cae61">reset_edges</a>();
<a name="l01440"></a>01440         <span class="keywordflow">if</span>(vol&gt;tolerance_sq) {
<a name="l01441"></a>01441                 vol=0.125/vol;
<a name="l01442"></a>01442                 cx=cx*vol+0.5*(*pts);
<a name="l01443"></a>01443                 cy=cy*vol+0.5*<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[1];
<a name="l01444"></a>01444                 cz=cz*vol+0.5*<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[2];
<a name="l01445"></a>01445         } <span class="keywordflow">else</span> cx=cy=cz=0;
<a name="l01446"></a>01446 }
<a name="l01447"></a>01447 <span class="comment"></span>
<a name="l01448"></a>01448 <span class="comment">/** Computes the maximum radius squared of a vertex from the center of the</span>
<a name="l01449"></a>01449 <span class="comment"> * cell. It can be used to determine when enough particles have been testing an</span>
<a name="l01450"></a>01450 <span class="comment"> * all planes that could cut the cell have been considered.</span>
<a name="l01451"></a>01451 <span class="comment"> * \return The maximum radius squared of a vertex.*/</span>
<a name="l01452"></a><a class="code" href="classvoro_1_1voronoicell__base.html#a6a29a361a158db038a5c4c8e47322bd5">01452</a> <span class="keywordtype">double</span> <a class="code" href="classvoro_1_1voronoicell__base.html#a6a29a361a158db038a5c4c8e47322bd5">voronoicell_base::max_radius_squared</a>() {
<a name="l01453"></a>01453         <span class="keywordtype">double</span> r,s,*ptsp=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>+3,*ptse=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>+3*<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;
<a name="l01454"></a>01454         r=*<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>*(*pts)+<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[1]*<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[1]+<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[2]*<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[2];
<a name="l01455"></a>01455         <span class="keywordflow">while</span>(ptsp&lt;ptse) {
<a name="l01456"></a>01456                 s=*ptsp*(*ptsp);ptsp++;
<a name="l01457"></a>01457                 s+=*ptsp*(*ptsp);ptsp++;
<a name="l01458"></a>01458                 s+=*ptsp*(*ptsp);ptsp++;
<a name="l01459"></a>01459                 <span class="keywordflow">if</span>(s&gt;r) r=s;
<a name="l01460"></a>01460         }
<a name="l01461"></a>01461         <span class="keywordflow">return</span> r;
<a name="l01462"></a>01462 }
<a name="l01463"></a>01463 <span class="comment"></span>
<a name="l01464"></a>01464 <span class="comment">/** Calculates the total edge distance of the Voronoi cell.</span>
<a name="l01465"></a>01465 <span class="comment"> * \return A floating point number holding the calculated distance. */</span>
<a name="l01466"></a><a class="code" href="classvoro_1_1voronoicell__base.html#a94fc0aba05c11fba465449bc1c4217e9">01466</a> <span class="keywordtype">double</span> <a class="code" href="classvoro_1_1voronoicell__base.html#a94fc0aba05c11fba465449bc1c4217e9">voronoicell_base::total_edge_distance</a>() {
<a name="l01467"></a>01467         <span class="keywordtype">int</span> i,j,k;
<a name="l01468"></a>01468         <span class="keywordtype">double</span> dis=0,dx,dy,dz;
<a name="l01469"></a>01469         <span class="keywordflow">for</span>(i=0;i&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>-1;i++) <span class="keywordflow">for</span>(j=0;j&lt;nu[i];j++) {
<a name="l01470"></a>01470                 k=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j];
<a name="l01471"></a>01471                 <span class="keywordflow">if</span>(k&gt;i) {
<a name="l01472"></a>01472                         dx=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*k]-<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*i];
<a name="l01473"></a>01473                         dy=pts[3*k+1]-pts[3*i+1];
<a name="l01474"></a>01474                         dz=pts[3*k+2]-pts[3*i+2];
<a name="l01475"></a>01475                         dis+=sqrt(dx*dx+dy*dy+dz*dz);
<a name="l01476"></a>01476                 }
<a name="l01477"></a>01477         }
<a name="l01478"></a>01478         <span class="keywordflow">return</span> 0.5*dis;
<a name="l01479"></a>01479 }
<a name="l01480"></a>01480 <span class="comment"></span>
<a name="l01481"></a>01481 <span class="comment">/** Outputs the edges of the Voronoi cell in POV-Ray format to an open file</span>
<a name="l01482"></a>01482 <span class="comment"> * stream, displacing the cell by given vector.</span>
<a name="l01483"></a>01483 <span class="comment"> * \param[in] (x,y,z) a displacement vector to be added to the cell&#39;s position.</span>
<a name="l01484"></a>01484 <span class="comment"> * \param[in] fp a file handle to write to. */</span>
<a name="l01485"></a><a class="code" href="classvoro_1_1voronoicell__base.html#a923ffa62bd5d62070cd29e01f3a1327a">01485</a> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__base.html#a923ffa62bd5d62070cd29e01f3a1327a">voronoicell_base::draw_pov</a>(<span class="keywordtype">double</span> x,<span class="keywordtype">double</span> y,<span class="keywordtype">double</span> z,FILE* fp) {
<a name="l01486"></a>01486         <span class="keywordtype">int</span> i,j,k;<span class="keywordtype">double</span> *ptsp=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>,*pt2;
<a name="l01487"></a>01487         <span class="keywordtype">char</span> posbuf1[128],posbuf2[128];
<a name="l01488"></a>01488         <span class="keywordflow">for</span>(i=0;i&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;i++,ptsp+=3) {
<a name="l01489"></a>01489                 sprintf(posbuf1,<span class="stringliteral">&quot;%g,%g,%g&quot;</span>,x+*ptsp*0.5,y+ptsp[1]*0.5,z+ptsp[2]*0.5);
<a name="l01490"></a>01490                 fprintf(fp,<span class="stringliteral">&quot;sphere{&lt;%s&gt;,r}\n&quot;</span>,posbuf1);
<a name="l01491"></a>01491                 <span class="keywordflow">for</span>(j=0;j&lt;nu[i];j++) {
<a name="l01492"></a>01492                         k=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j];
<a name="l01493"></a>01493                         <span class="keywordflow">if</span>(k&lt;i) {
<a name="l01494"></a>01494                                 pt2=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>+3*k;
<a name="l01495"></a>01495                                 sprintf(posbuf2,<span class="stringliteral">&quot;%g,%g,%g&quot;</span>,x+*pt2*0.5,y+0.5*pt2[1],z+0.5*pt2[2]);
<a name="l01496"></a>01496                                 <span class="keywordflow">if</span>(strcmp(posbuf1,posbuf2)!=0) fprintf(fp,<span class="stringliteral">&quot;cylinder{&lt;%s&gt;,&lt;%s&gt;,r}\n&quot;</span>,posbuf1,posbuf2);
<a name="l01497"></a>01497                         }
<a name="l01498"></a>01498                 }
<a name="l01499"></a>01499         }
<a name="l01500"></a>01500 }
<a name="l01501"></a>01501 <span class="comment"></span>
<a name="l01502"></a>01502 <span class="comment">/** Outputs the edges of the Voronoi cell in gnuplot format to an output stream.</span>
<a name="l01503"></a>01503 <span class="comment"> * \param[in] (x,y,z) a displacement vector to be added to the cell&#39;s position.</span>
<a name="l01504"></a>01504 <span class="comment"> * \param[in] fp a file handle to write to. */</span>
<a name="l01505"></a><a class="code" href="classvoro_1_1voronoicell__base.html#a1c0657c1d89313089bbd437170c97d46">01505</a> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__base.html#a1c0657c1d89313089bbd437170c97d46">voronoicell_base::draw_gnuplot</a>(<span class="keywordtype">double</span> x,<span class="keywordtype">double</span> y,<span class="keywordtype">double</span> z,FILE *fp) {
<a name="l01506"></a>01506         <span class="keywordtype">int</span> i,j,k,l,m;
<a name="l01507"></a>01507         <span class="keywordflow">for</span>(i=1;i&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;i++) <span class="keywordflow">for</span>(j=0;j&lt;nu[i];j++) {
<a name="l01508"></a>01508                 k=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j];
<a name="l01509"></a>01509                 <span class="keywordflow">if</span>(k&gt;=0) {
<a name="l01510"></a>01510                         fprintf(fp,<span class="stringliteral">&quot;%g %g %g\n&quot;</span>,x+0.5*<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*i],y+0.5*<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*i+1],z+0.5*<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*i+2]);
<a name="l01511"></a>01511                         l=i;m=j;
<a name="l01512"></a>01512                         <span class="keywordflow">do</span> {
<a name="l01513"></a>01513                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[l][nu[l]+m]]=-1-l;
<a name="l01514"></a>01514                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[l][m]=-1-k;
<a name="l01515"></a>01515                                 l=k;
<a name="l01516"></a>01516                                 fprintf(fp,<span class="stringliteral">&quot;%g %g %g\n&quot;</span>,x+0.5*<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*k],y+0.5*<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*k+1],z+0.5*<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*k+2]);
<a name="l01517"></a>01517                         } <span class="keywordflow">while</span> (search_edge(l,m,k));
<a name="l01518"></a>01518                         fputs(<span class="stringliteral">&quot;\n\n&quot;</span>,fp);
<a name="l01519"></a>01519                 }
<a name="l01520"></a>01520         }
<a name="l01521"></a>01521         <a class="code" href="classvoro_1_1voronoicell__base.html#a5d09c9e36ad159fcd23cfef8855cae61">reset_edges</a>();
<a name="l01522"></a>01522 }
<a name="l01523"></a>01523 
<a name="l01524"></a>01524 <span class="keyword">inline</span> <span class="keywordtype">bool</span> voronoicell_base::search_edge(<span class="keywordtype">int</span> l,<span class="keywordtype">int</span> &amp;m,<span class="keywordtype">int</span> &amp;k) {
<a name="l01525"></a>01525         <span class="keywordflow">for</span>(m=0;m&lt;nu[l];m++) {
<a name="l01526"></a>01526                 k=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[l][m];
<a name="l01527"></a>01527                 <span class="keywordflow">if</span>(k&gt;=0) <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l01528"></a>01528         }
<a name="l01529"></a>01529         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l01530"></a>01530 }
<a name="l01531"></a>01531 <span class="comment"></span>
<a name="l01532"></a>01532 <span class="comment">/** Outputs the Voronoi cell in the POV mesh2 format, described in section</span>
<a name="l01533"></a>01533 <span class="comment"> * 1.3.2.2 of the POV-Ray documentation. The mesh2 output consists of a list of</span>
<a name="l01534"></a>01534 <span class="comment"> * vertex vectors, followed by a list of triangular faces. The routine also</span>
<a name="l01535"></a>01535 <span class="comment"> * makes use of the optional inside_vector specification, which makes the mesh</span>
<a name="l01536"></a>01536 <span class="comment"> * object solid, so the the POV-Ray Constructive Solid Geometry (CSG) can be</span>
<a name="l01537"></a>01537 <span class="comment"> * applied.</span>
<a name="l01538"></a>01538 <span class="comment"> * \param[in] (x,y,z) a displacement vector to be added to the cell&#39;s position.</span>
<a name="l01539"></a>01539 <span class="comment"> * \param[in] fp a file handle to write to. */</span>
<a name="l01540"></a><a class="code" href="classvoro_1_1voronoicell__base.html#a1b52986eadcea3b6b230626a6dbddc40">01540</a> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__base.html#a1b52986eadcea3b6b230626a6dbddc40">voronoicell_base::draw_pov_mesh</a>(<span class="keywordtype">double</span> x,<span class="keywordtype">double</span> y,<span class="keywordtype">double</span> z,FILE *fp) {
<a name="l01541"></a>01541         <span class="keywordtype">int</span> i,j,k,l,m,n;
<a name="l01542"></a>01542         <span class="keywordtype">double</span> *ptsp=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>;
<a name="l01543"></a>01543         fprintf(fp,<span class="stringliteral">&quot;mesh2 {\nvertex_vectors {\n%d\n&quot;</span>,<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>);
<a name="l01544"></a>01544         <span class="keywordflow">for</span>(i=0;i&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;i++,ptsp+=3) fprintf(fp,<span class="stringliteral">&quot;,&lt;%g,%g,%g&gt;\n&quot;</span>,x+*ptsp*0.5,y+ptsp[1]*0.5,z+ptsp[2]*0.5);
<a name="l01545"></a>01545         fprintf(fp,<span class="stringliteral">&quot;}\nface_indices {\n%d\n&quot;</span>,(p-2)&lt;&lt;1);
<a name="l01546"></a>01546         <span class="keywordflow">for</span>(i=1;i&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;i++) <span class="keywordflow">for</span>(j=0;j&lt;nu[i];j++) {
<a name="l01547"></a>01547                 k=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j];
<a name="l01548"></a>01548                 <span class="keywordflow">if</span>(k&gt;=0) {
<a name="l01549"></a>01549                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j]=-1-k;
<a name="l01550"></a>01550                         l=<a class="code" href="classvoro_1_1voronoicell__base.html#a1d86762311d8860960a45cc409b14f0f">cycle_up</a>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][nu[i]+j],k);
<a name="l01551"></a>01551                         m=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l];<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l]=-1-m;
<a name="l01552"></a>01552                         <span class="keywordflow">while</span>(m!=i) {
<a name="l01553"></a>01553                                 n=<a class="code" href="classvoro_1_1voronoicell__base.html#a1d86762311d8860960a45cc409b14f0f">cycle_up</a>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][nu[k]+l],m);
<a name="l01554"></a>01554                                 fprintf(fp,<span class="stringliteral">&quot;,&lt;%d,%d,%d&gt;\n&quot;</span>,i,k,m);
<a name="l01555"></a>01555                                 k=m;l=n;
<a name="l01556"></a>01556                                 m=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l];<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l]=-1-m;
<a name="l01557"></a>01557                         }
<a name="l01558"></a>01558                 }
<a name="l01559"></a>01559         }
<a name="l01560"></a>01560         fputs(<span class="stringliteral">&quot;}\ninside_vector &lt;0,0,1&gt;\n}\n&quot;</span>,fp);
<a name="l01561"></a>01561         <a class="code" href="classvoro_1_1voronoicell__base.html#a5d09c9e36ad159fcd23cfef8855cae61">reset_edges</a>();
<a name="l01562"></a>01562 }
<a name="l01563"></a>01563 <span class="comment"></span>
<a name="l01564"></a>01564 <span class="comment">/** Several routines in the class that gather cell-based statistics internally</span>
<a name="l01565"></a>01565 <span class="comment"> * track their progress by flipping edges to negative so that they know what</span>
<a name="l01566"></a>01566 <span class="comment"> * parts of the cell have already been tested. This function resets them back</span>
<a name="l01567"></a>01567 <span class="comment"> * to positive. When it is called, it assumes that every edge in the routine</span>
<a name="l01568"></a>01568 <span class="comment"> * should have already been flipped to negative, and it bails out with an</span>
<a name="l01569"></a>01569 <span class="comment"> * internal error if it encounters a positive edge. */</span>
<a name="l01570"></a><a class="code" href="classvoro_1_1voronoicell__base.html#a5d09c9e36ad159fcd23cfef8855cae61">01570</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__base.html#a5d09c9e36ad159fcd23cfef8855cae61">voronoicell_base::reset_edges</a>() {
<a name="l01571"></a>01571         <span class="keywordtype">int</span> i,j;
<a name="l01572"></a>01572         <span class="keywordflow">for</span>(i=0;i&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;i++) <span class="keywordflow">for</span>(j=0;j&lt;nu[i];j++) {
<a name="l01573"></a>01573                 <span class="keywordflow">if</span>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j]&gt;=0) voro_fatal_error(<span class="stringliteral">&quot;Edge reset routine found a previously untested edge&quot;</span>,<a class="code" href="config_8hh.html#ad8e0de9d48da06e86dd87884e4a2d47e">VOROPP_INTERNAL_ERROR</a>);
<a name="l01574"></a>01574                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j]=-1-<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j];
<a name="l01575"></a>01575         }
<a name="l01576"></a>01576 }
<a name="l01577"></a>01577 <span class="comment"></span>
<a name="l01578"></a>01578 <span class="comment">/** Checks to see if a given vertex is inside, outside or within the test</span>
<a name="l01579"></a>01579 <span class="comment"> * plane. If the point is far away from the test plane, the routine immediately</span>
<a name="l01580"></a>01580 <span class="comment"> * returns whether it is inside or outside. If the routine is close the the</span>
<a name="l01581"></a>01581 <span class="comment"> * plane and within the specified tolerance, then the special check_marginal()</span>
<a name="l01582"></a>01582 <span class="comment"> * routine is called.</span>
<a name="l01583"></a>01583 <span class="comment"> * \param[in] n the vertex to test.</span>
<a name="l01584"></a>01584 <span class="comment"> * \param[out] ans the result of the scalar product used in evaluating the</span>
<a name="l01585"></a>01585 <span class="comment"> *                 location of the point.</span>
<a name="l01586"></a>01586 <span class="comment"> * \return -1 if the point is inside the plane, 1 if the point is outside the</span>
<a name="l01587"></a>01587 <span class="comment"> *         plane, or 0 if the point is within the plane. */</span>
<a name="l01588"></a>01588 <span class="keyword">inline</span> <span class="keywordtype">int</span> voronoicell_base::m_test(<span class="keywordtype">int</span> n,<span class="keywordtype">double</span> &amp;ans) {
<a name="l01589"></a>01589         <span class="keywordtype">double</span> *pp=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>+n+(n&lt;&lt;1);
<a name="l01590"></a>01590         ans=*(pp++)*px;
<a name="l01591"></a>01591         ans+=*(pp++)*py;
<a name="l01592"></a>01592         ans+=*pp*pz-prsq;
<a name="l01593"></a>01593         <span class="keywordflow">if</span>(ans&lt;-tolerance2) {
<a name="l01594"></a>01594                 <span class="keywordflow">return</span> -1;
<a name="l01595"></a>01595         } <span class="keywordflow">else</span> <span class="keywordflow">if</span>(ans&gt;tolerance2) {
<a name="l01596"></a>01596                 <span class="keywordflow">return</span> 1;
<a name="l01597"></a>01597         }
<a name="l01598"></a>01598         <span class="keywordflow">return</span> check_marginal(n,ans);
<a name="l01599"></a>01599 }
<a name="l01600"></a>01600 <span class="comment"></span>
<a name="l01601"></a>01601 <span class="comment">/** Checks to see if a given vertex is inside, outside or within the test</span>
<a name="l01602"></a>01602 <span class="comment"> * plane, for the case when the point has been detected to be very close to the</span>
<a name="l01603"></a>01603 <span class="comment"> * plane. The routine ensures that the returned results are always consistent</span>
<a name="l01604"></a>01604 <span class="comment"> * with previous tests, by keeping a table of any marginal results. The routine</span>
<a name="l01605"></a>01605 <span class="comment"> * first sees if the vertex is in the table, and if it finds a previously</span>
<a name="l01606"></a>01606 <span class="comment"> * computed result it uses that. Otherwise, it computes a result for this</span>
<a name="l01607"></a>01607 <span class="comment"> * vertex and adds it the table.</span>
<a name="l01608"></a>01608 <span class="comment"> * \param[in] n the vertex to test.</span>
<a name="l01609"></a>01609 <span class="comment"> * \param[in] ans the result of the scalar product used in evaluating</span>
<a name="l01610"></a>01610 <span class="comment"> *                the location of the point.</span>
<a name="l01611"></a>01611 <span class="comment"> * \return -1 if the point is inside the plane, 1 if the point is outside the</span>
<a name="l01612"></a>01612 <span class="comment"> *         plane, or 0 if the point is within the plane. */</span>
<a name="l01613"></a>01613 <span class="keywordtype">int</span> voronoicell_base::check_marginal(<span class="keywordtype">int</span> n,<span class="keywordtype">double</span> &amp;ans) {
<a name="l01614"></a>01614         <span class="keywordtype">int</span> i;
<a name="l01615"></a>01615         <span class="keywordflow">for</span>(i=0;i&lt;n_marg;i+=2) <span class="keywordflow">if</span>(marg[i]==n) <span class="keywordflow">return</span> marg[i+1];
<a name="l01616"></a>01616         <span class="keywordflow">if</span>(n_marg==current_marginal) {
<a name="l01617"></a>01617                 current_marginal&lt;&lt;=1;
<a name="l01618"></a>01618                 <span class="keywordflow">if</span>(current_marginal&gt;max_marginal)
<a name="l01619"></a>01619                         voro_fatal_error(<span class="stringliteral">&quot;Marginal case buffer allocation exceeded absolute maximum&quot;</span>,<a class="code" href="config_8hh.html#a5dc0616f8a67ae3d1c2ba8a3dcf5612b">VOROPP_MEMORY_ERROR</a>);
<a name="l01620"></a>01620 <span class="preprocessor">#if VOROPP_VERBOSE &gt;=2</span>
<a name="l01621"></a>01621 <span class="preprocessor"></span>                fprintf(stderr,<span class="stringliteral">&quot;Marginal cases buffer scaled up to %d\n&quot;</span>,i);
<a name="l01622"></a>01622 <span class="preprocessor">#endif</span>
<a name="l01623"></a>01623 <span class="preprocessor"></span>                <span class="keywordtype">int</span> *pmarg=<span class="keyword">new</span> <span class="keywordtype">int</span>[current_marginal];
<a name="l01624"></a>01624                 <span class="keywordflow">for</span>(<span class="keywordtype">int</span> j=0;j&lt;n_marg;j++) pmarg[j]=marg[j];
<a name="l01625"></a>01625                 <span class="keyword">delete</span> [] marg;
<a name="l01626"></a>01626                 marg=pmarg;
<a name="l01627"></a>01627         }
<a name="l01628"></a>01628         marg[n_marg++]=n;
<a name="l01629"></a>01629         marg[n_marg++]=ans&gt;tolerance?1:(ans&lt;-tolerance?-1:0);
<a name="l01630"></a>01630         <span class="keywordflow">return</span> marg[n_marg-1];
<a name="l01631"></a>01631 }
<a name="l01632"></a>01632 <span class="comment"></span>
<a name="l01633"></a>01633 <span class="comment">/** For each face of the Voronoi cell, this routine prints the out the normal</span>
<a name="l01634"></a>01634 <span class="comment"> * vector of the face, and scales it to the distance from the cell center to</span>
<a name="l01635"></a>01635 <span class="comment"> * that plane.</span>
<a name="l01636"></a>01636 <span class="comment"> * \param[out] v the vector to store the results in. */</span>
<a name="l01637"></a><a class="code" href="classvoro_1_1voronoicell__base.html#a203881f2c90c18ca4ffd7ac0d8b8a61c">01637</a> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__base.html#a203881f2c90c18ca4ffd7ac0d8b8a61c">voronoicell_base::normals</a>(vector&lt;double&gt; &amp;v) {
<a name="l01638"></a>01638         <span class="keywordtype">int</span> i,j,k;
<a name="l01639"></a>01639         v.clear();
<a name="l01640"></a>01640         <span class="keywordflow">for</span>(i=1;i&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;i++) <span class="keywordflow">for</span>(j=0;j&lt;nu[i];j++) {
<a name="l01641"></a>01641                 k=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j];
<a name="l01642"></a>01642                 <span class="keywordflow">if</span>(k&gt;=0) normals_search(v,i,j,k);
<a name="l01643"></a>01643         }
<a name="l01644"></a>01644         <a class="code" href="classvoro_1_1voronoicell__base.html#a5d09c9e36ad159fcd23cfef8855cae61">reset_edges</a>();
<a name="l01645"></a>01645 }
<a name="l01646"></a>01646 <span class="comment"></span>
<a name="l01647"></a>01647 <span class="comment">/** This inline routine is called by normals(). It attempts to construct a</span>
<a name="l01648"></a>01648 <span class="comment"> * single normal vector that is associated with a particular face. It first</span>
<a name="l01649"></a>01649 <span class="comment"> * traces around the face, trying to find two vectors along the face edges</span>
<a name="l01650"></a>01650 <span class="comment"> * whose vector product is above the numerical tolerance. It then constructs</span>
<a name="l01651"></a>01651 <span class="comment"> * the normal vector using this product. If the face is too small, and none of</span>
<a name="l01652"></a>01652 <span class="comment"> * the vector products are large enough, the routine may return (0,0,0) as the</span>
<a name="l01653"></a>01653 <span class="comment"> * normal vector.</span>
<a name="l01654"></a>01654 <span class="comment"> * \param[in] v the vector to store the results in.</span>
<a name="l01655"></a>01655 <span class="comment"> * \param[in] i the initial vertex of the face to test.</span>
<a name="l01656"></a>01656 <span class="comment"> * \param[in] j the index of an edge of the vertex.</span>
<a name="l01657"></a>01657 <span class="comment"> * \param[in] k the neighboring vertex of i, set to ed[i][j]. */</span>
<a name="l01658"></a>01658 <span class="keyword">inline</span> <span class="keywordtype">void</span> voronoicell_base::normals_search(vector&lt;double&gt; &amp;v,<span class="keywordtype">int</span> i,<span class="keywordtype">int</span> j,<span class="keywordtype">int</span> k) {
<a name="l01659"></a>01659         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j]=-1-k;
<a name="l01660"></a>01660         <span class="keywordtype">int</span> l=<a class="code" href="classvoro_1_1voronoicell__base.html#a1d86762311d8860960a45cc409b14f0f">cycle_up</a>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][nu[i]+j],k),m;
<a name="l01661"></a>01661         <span class="keywordtype">double</span> ux,uy,uz,vx,vy,vz,wx,wy,wz,wmag;
<a name="l01662"></a>01662         <span class="keywordflow">do</span> {
<a name="l01663"></a>01663                 m=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l];<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l]=-1-m;
<a name="l01664"></a>01664                 ux=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*m]-<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>[3*k];
<a name="l01665"></a>01665                 uy=pts[3*m+1]-pts[3*k+1];
<a name="l01666"></a>01666                 uz=pts[3*m+2]-pts[3*k+2];
<a name="l01667"></a>01667 
<a name="l01668"></a>01668                 <span class="comment">// Test to see if the length of this edge is above the tolerance</span>
<a name="l01669"></a>01669                 <span class="keywordflow">if</span>(ux*ux+uy*uy+uz*uz&gt;tolerance_sq) {
<a name="l01670"></a>01670                         <span class="keywordflow">while</span>(m!=i) {
<a name="l01671"></a>01671                                 l=<a class="code" href="classvoro_1_1voronoicell__base.html#a1d86762311d8860960a45cc409b14f0f">cycle_up</a>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][nu[k]+l],m);
<a name="l01672"></a>01672                                 k=m;m=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l];<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l]=-1-m;
<a name="l01673"></a>01673                                 vx=pts[3*m]-pts[3*k];
<a name="l01674"></a>01674                                 vy=pts[3*m+1]-pts[3*k+1];
<a name="l01675"></a>01675                                 vz=pts[3*m+2]-pts[3*k+2];
<a name="l01676"></a>01676 
<a name="l01677"></a>01677                                 <span class="comment">// Construct the vector product of this edge with</span>
<a name="l01678"></a>01678                                 <span class="comment">// the previous one</span>
<a name="l01679"></a>01679                                 wx=uz*vy-uy*vz;
<a name="l01680"></a>01680                                 wy=ux*vz-uz*vx;
<a name="l01681"></a>01681                                 wz=uy*vx-ux*vy;
<a name="l01682"></a>01682                                 wmag=wx*wx+wy*wy+wz*wz;
<a name="l01683"></a>01683 
<a name="l01684"></a>01684                                 <span class="comment">// Test to see if this vector product of the</span>
<a name="l01685"></a>01685                                 <span class="comment">// two edges is above the tolerance</span>
<a name="l01686"></a>01686                                 <span class="keywordflow">if</span>(wmag&gt;tolerance_sq) {
<a name="l01687"></a>01687 
<a name="l01688"></a>01688                                         <span class="comment">// Construct the normal vector and print it</span>
<a name="l01689"></a>01689                                         wmag=1/sqrt(wmag);
<a name="l01690"></a>01690                                         v.push_back(wx*wmag);
<a name="l01691"></a>01691                                         v.push_back(wy*wmag);
<a name="l01692"></a>01692                                         v.push_back(wz*wmag);
<a name="l01693"></a>01693 
<a name="l01694"></a>01694                                         <span class="comment">// Mark all of the remaining edges of this</span>
<a name="l01695"></a>01695                                         <span class="comment">// face and exit</span>
<a name="l01696"></a>01696                                         <span class="keywordflow">while</span>(m!=i) {
<a name="l01697"></a>01697                                                 l=<a class="code" href="classvoro_1_1voronoicell__base.html#a1d86762311d8860960a45cc409b14f0f">cycle_up</a>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][nu[k]+l],m);
<a name="l01698"></a>01698                                                 k=m;m=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l];<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l]=-1-m;
<a name="l01699"></a>01699                                         }
<a name="l01700"></a>01700                                         <span class="keywordflow">return</span>;
<a name="l01701"></a>01701                                 }
<a name="l01702"></a>01702                         }
<a name="l01703"></a>01703                         v.push_back(0);
<a name="l01704"></a>01704                         v.push_back(0);
<a name="l01705"></a>01705                         v.push_back(0);
<a name="l01706"></a>01706                         <span class="keywordflow">return</span>;
<a name="l01707"></a>01707                 }
<a name="l01708"></a>01708                 l=<a class="code" href="classvoro_1_1voronoicell__base.html#a1d86762311d8860960a45cc409b14f0f">cycle_up</a>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][nu[k]+l],m);
<a name="l01709"></a>01709                 k=m;
<a name="l01710"></a>01710         } <span class="keywordflow">while</span> (k!=i);
<a name="l01711"></a>01711         v.push_back(0);
<a name="l01712"></a>01712         v.push_back(0);
<a name="l01713"></a>01713         v.push_back(0);
<a name="l01714"></a>01714 }
<a name="l01715"></a>01715 
<a name="l01716"></a>01716 <span class="comment"></span>
<a name="l01717"></a>01717 <span class="comment">/** Returns the number of faces of a computed Voronoi cell.</span>
<a name="l01718"></a>01718 <span class="comment"> * \return The number of faces. */</span>
<a name="l01719"></a><a class="code" href="classvoro_1_1voronoicell__base.html#a56b835abe6d47cb67b206202125eb406">01719</a> <span class="keywordtype">int</span> <a class="code" href="classvoro_1_1voronoicell__base.html#a56b835abe6d47cb67b206202125eb406">voronoicell_base::number_of_faces</a>() {
<a name="l01720"></a>01720         <span class="keywordtype">int</span> i,j,k,l,m,s=0;
<a name="l01721"></a>01721         <span class="keywordflow">for</span>(i=1;i&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;i++) <span class="keywordflow">for</span>(j=0;j&lt;nu[i];j++) {
<a name="l01722"></a>01722                 k=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j];
<a name="l01723"></a>01723                 <span class="keywordflow">if</span>(k&gt;=0) {
<a name="l01724"></a>01724                         s++;
<a name="l01725"></a>01725                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j]=-1-k;
<a name="l01726"></a>01726                         l=<a class="code" href="classvoro_1_1voronoicell__base.html#a1d86762311d8860960a45cc409b14f0f">cycle_up</a>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][nu[i]+j],k);
<a name="l01727"></a>01727                         <span class="keywordflow">do</span> {
<a name="l01728"></a>01728                                 m=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l];
<a name="l01729"></a>01729                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l]=-1-m;
<a name="l01730"></a>01730                                 l=<a class="code" href="classvoro_1_1voronoicell__base.html#a1d86762311d8860960a45cc409b14f0f">cycle_up</a>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][nu[k]+l],m);
<a name="l01731"></a>01731                                 k=m;
<a name="l01732"></a>01732                         } <span class="keywordflow">while</span> (k!=i);
<a name="l01733"></a>01733 
<a name="l01734"></a>01734                 }
<a name="l01735"></a>01735         }
<a name="l01736"></a>01736         <a class="code" href="classvoro_1_1voronoicell__base.html#a5d09c9e36ad159fcd23cfef8855cae61">reset_edges</a>();
<a name="l01737"></a>01737         <span class="keywordflow">return</span> s;
<a name="l01738"></a>01738 }
<a name="l01739"></a>01739 <span class="comment"></span>
<a name="l01740"></a>01740 <span class="comment">/** Returns a vector of the vertex orders.</span>
<a name="l01741"></a>01741 <span class="comment"> * \param[out] v the vector to store the results in. */</span>
<a name="l01742"></a><a class="code" href="classvoro_1_1voronoicell__base.html#aa900514b399297edb7dfc430f92716b9">01742</a> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__base.html#aa900514b399297edb7dfc430f92716b9">voronoicell_base::vertex_orders</a>(vector&lt;int&gt; &amp;v) {
<a name="l01743"></a>01743         v.resize(<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>);
<a name="l01744"></a>01744         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;i++) v[i]=nu[i];
<a name="l01745"></a>01745 }
<a name="l01746"></a>01746 <span class="comment"></span>
<a name="l01747"></a>01747 <span class="comment">/** Outputs the vertex orders.</span>
<a name="l01748"></a>01748 <span class="comment"> * \param[out] fp the file handle to write to. */</span>
<a name="l01749"></a><a class="code" href="classvoro_1_1voronoicell__base.html#af92d19d0e7fc07006bcd8ea30c9df447">01749</a> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__base.html#af92d19d0e7fc07006bcd8ea30c9df447">voronoicell_base::output_vertex_orders</a>(FILE *fp) {
<a name="l01750"></a>01750         <span class="keywordflow">if</span>(<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>&gt;0) {
<a name="l01751"></a>01751                 fprintf(fp,<span class="stringliteral">&quot;%d&quot;</span>,*nu);
<a name="l01752"></a>01752                 <span class="keywordflow">for</span>(<span class="keywordtype">int</span> *nup=nu+1;nup&lt;nu+<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;nup++) fprintf(fp,<span class="stringliteral">&quot; %d&quot;</span>,*nup);
<a name="l01753"></a>01753         }
<a name="l01754"></a>01754 }
<a name="l01755"></a>01755 <span class="comment"></span>
<a name="l01756"></a>01756 <span class="comment">/** Returns a vector of the vertex vectors using the local coordinate system.</span>
<a name="l01757"></a>01757 <span class="comment"> * \param[out] v the vector to store the results in. */</span>
<a name="l01758"></a><a class="code" href="classvoro_1_1voronoicell__base.html#afd699f0ae6578788dac0d427efa3ad44">01758</a> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__base.html#afd699f0ae6578788dac0d427efa3ad44">voronoicell_base::vertices</a>(vector&lt;double&gt; &amp;v) {
<a name="l01759"></a>01759         v.resize(3*<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>);
<a name="l01760"></a>01760         <span class="keywordtype">double</span> *ptsp=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>;
<a name="l01761"></a>01761         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i&lt;3*<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;i+=3) {
<a name="l01762"></a>01762                 v[i]=*(ptsp++)*0.5;
<a name="l01763"></a>01763                 v[i+1]=*(ptsp++)*0.5;
<a name="l01764"></a>01764                 v[i+2]=*(ptsp++)*0.5;
<a name="l01765"></a>01765         }
<a name="l01766"></a>01766 }
<a name="l01767"></a>01767 <span class="comment"></span>
<a name="l01768"></a>01768 <span class="comment">/** Outputs the vertex vectors using the local coordinate system.</span>
<a name="l01769"></a>01769 <span class="comment"> * \param[out] fp the file handle to write to. */</span>
<a name="l01770"></a><a class="code" href="classvoro_1_1voronoicell__base.html#aee879731b1f4feb9f630d9b7f9c0062f">01770</a> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__base.html#aee879731b1f4feb9f630d9b7f9c0062f">voronoicell_base::output_vertices</a>(FILE *fp) {
<a name="l01771"></a>01771         <span class="keywordflow">if</span>(<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>&gt;0) {
<a name="l01772"></a>01772                 fprintf(fp,<span class="stringliteral">&quot;(%g,%g,%g)&quot;</span>,*pts*0.5,pts[1]*0.5,pts[2]*0.5);
<a name="l01773"></a>01773                 <span class="keywordflow">for</span>(<span class="keywordtype">double</span> *ptsp=pts+3;ptsp&lt;pts+3*<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;ptsp+=3) fprintf(fp,<span class="stringliteral">&quot; (%g,%g,%g)&quot;</span>,*ptsp*0.5,ptsp[1]*0.5,ptsp[2]*0.5);
<a name="l01774"></a>01774         }
<a name="l01775"></a>01775 }
<a name="l01776"></a>01776 
<a name="l01777"></a>01777 <span class="comment"></span>
<a name="l01778"></a>01778 <span class="comment">/** Returns a vector of the vertex vectors in the global coordinate system.</span>
<a name="l01779"></a>01779 <span class="comment"> * \param[out] v the vector to store the results in.</span>
<a name="l01780"></a>01780 <span class="comment"> * \param[in] (x,y,z) the position vector of the particle in the global</span>
<a name="l01781"></a>01781 <span class="comment"> *                    coordinate system. */</span>
<a name="l01782"></a><a class="code" href="classvoro_1_1voronoicell__base.html#a32e9aef70e601984105d6929543dc681">01782</a> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__base.html#afd699f0ae6578788dac0d427efa3ad44">voronoicell_base::vertices</a>(<span class="keywordtype">double</span> x,<span class="keywordtype">double</span> y,<span class="keywordtype">double</span> z,vector&lt;double&gt; &amp;v) {
<a name="l01783"></a>01783         v.resize(3*<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>);
<a name="l01784"></a>01784         <span class="keywordtype">double</span> *ptsp=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>;
<a name="l01785"></a>01785         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i&lt;3*<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;i+=3) {
<a name="l01786"></a>01786                 v[i]=x+*(ptsp++)*0.5;
<a name="l01787"></a>01787                 v[i+1]=y+*(ptsp++)*0.5;
<a name="l01788"></a>01788                 v[i+2]=z+*(ptsp++)*0.5;
<a name="l01789"></a>01789         }
<a name="l01790"></a>01790 }
<a name="l01791"></a>01791 <span class="comment"></span>
<a name="l01792"></a>01792 <span class="comment">/** Outputs the vertex vectors using the global coordinate system.</span>
<a name="l01793"></a>01793 <span class="comment"> * \param[out] fp the file handle to write to.</span>
<a name="l01794"></a>01794 <span class="comment"> * \param[in] (x,y,z) the position vector of the particle in the global</span>
<a name="l01795"></a>01795 <span class="comment"> *                    coordinate system. */</span>
<a name="l01796"></a><a class="code" href="classvoro_1_1voronoicell__base.html#aec32739bb3f9393f4ddc33d90796d494">01796</a> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__base.html#aee879731b1f4feb9f630d9b7f9c0062f">voronoicell_base::output_vertices</a>(<span class="keywordtype">double</span> x,<span class="keywordtype">double</span> y,<span class="keywordtype">double</span> z,FILE *fp) {
<a name="l01797"></a>01797         <span class="keywordflow">if</span>(<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>&gt;0) {
<a name="l01798"></a>01798                 fprintf(fp,<span class="stringliteral">&quot;(%g,%g,%g)&quot;</span>,x+*pts*0.5,y+pts[1]*0.5,z+pts[2]*0.5);
<a name="l01799"></a>01799                 <span class="keywordflow">for</span>(<span class="keywordtype">double</span> *ptsp=pts+3;ptsp&lt;pts+3*<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;ptsp+=3) fprintf(fp,<span class="stringliteral">&quot; (%g,%g,%g)&quot;</span>,x+*ptsp*0.5,y+ptsp[1]*0.5,z+ptsp[2]*0.5);
<a name="l01800"></a>01800         }
<a name="l01801"></a>01801 }
<a name="l01802"></a>01802 <span class="comment"></span>
<a name="l01803"></a>01803 <span class="comment">/** This routine returns the perimeters of each face.</span>
<a name="l01804"></a>01804 <span class="comment"> * \param[out] v the vector to store the results in. */</span>
<a name="l01805"></a><a class="code" href="classvoro_1_1voronoicell__base.html#aca984813e3a98a75d2e280fafca519da">01805</a> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__base.html#aca984813e3a98a75d2e280fafca519da">voronoicell_base::face_perimeters</a>(vector&lt;double&gt; &amp;v) {
<a name="l01806"></a>01806         v.clear();
<a name="l01807"></a>01807         <span class="keywordtype">int</span> i,j,k,l,m;
<a name="l01808"></a>01808         <span class="keywordtype">double</span> dx,dy,dz,perim;
<a name="l01809"></a>01809         <span class="keywordflow">for</span>(i=1;i&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;i++) <span class="keywordflow">for</span>(j=0;j&lt;nu[i];j++) {
<a name="l01810"></a>01810                 k=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j];
<a name="l01811"></a>01811                 <span class="keywordflow">if</span>(k&gt;=0) {
<a name="l01812"></a>01812                         dx=pts[3*k]-pts[3*i];
<a name="l01813"></a>01813                         dy=pts[3*k+1]-pts[3*i+1];
<a name="l01814"></a>01814                         dz=pts[3*k+2]-pts[3*i+2];
<a name="l01815"></a>01815                         perim=sqrt(dx*dx+dy*dy+dz*dz);
<a name="l01816"></a>01816                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j]=-1-k;
<a name="l01817"></a>01817                         l=<a class="code" href="classvoro_1_1voronoicell__base.html#a1d86762311d8860960a45cc409b14f0f">cycle_up</a>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][nu[i]+j],k);
<a name="l01818"></a>01818                         <span class="keywordflow">do</span> {
<a name="l01819"></a>01819                                 m=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l];
<a name="l01820"></a>01820                                 dx=pts[3*m]-pts[3*k];
<a name="l01821"></a>01821                                 dy=pts[3*m+1]-pts[3*k+1];
<a name="l01822"></a>01822                                 dz=pts[3*m+2]-pts[3*k+2];
<a name="l01823"></a>01823                                 perim+=sqrt(dx*dx+dy*dy+dz*dz);
<a name="l01824"></a>01824                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l]=-1-m;
<a name="l01825"></a>01825                                 l=<a class="code" href="classvoro_1_1voronoicell__base.html#a1d86762311d8860960a45cc409b14f0f">cycle_up</a>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][nu[k]+l],m);
<a name="l01826"></a>01826                                 k=m;
<a name="l01827"></a>01827                         } <span class="keywordflow">while</span> (k!=i);
<a name="l01828"></a>01828                         v.push_back(0.5*perim);
<a name="l01829"></a>01829                 }
<a name="l01830"></a>01830         }
<a name="l01831"></a>01831         <a class="code" href="classvoro_1_1voronoicell__base.html#a5d09c9e36ad159fcd23cfef8855cae61">reset_edges</a>();
<a name="l01832"></a>01832 }
<a name="l01833"></a>01833 <span class="comment"></span>
<a name="l01834"></a>01834 <span class="comment">/** For each face, this routine outputs a bracketed sequence of numbers</span>
<a name="l01835"></a>01835 <span class="comment"> * containing a list of all the vertices that make up that face.</span>
<a name="l01836"></a>01836 <span class="comment"> * \param[out] v the vector to store the results in. */</span>
<a name="l01837"></a><a class="code" href="classvoro_1_1voronoicell__base.html#a955288d82dfe6c2d567b1cfb906aa419">01837</a> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__base.html#a955288d82dfe6c2d567b1cfb906aa419">voronoicell_base::face_vertices</a>(vector&lt;int&gt; &amp;v) {
<a name="l01838"></a>01838         <span class="keywordtype">int</span> i,j,k,l,m,vp(0),vn;
<a name="l01839"></a>01839         v.clear();
<a name="l01840"></a>01840         <span class="keywordflow">for</span>(i=1;i&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;i++) <span class="keywordflow">for</span>(j=0;j&lt;nu[i];j++) {
<a name="l01841"></a>01841                 k=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j];
<a name="l01842"></a>01842                 <span class="keywordflow">if</span>(k&gt;=0) {
<a name="l01843"></a>01843                         v.push_back(0);
<a name="l01844"></a>01844                         v.push_back(i);
<a name="l01845"></a>01845                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j]=-1-k;
<a name="l01846"></a>01846                         l=<a class="code" href="classvoro_1_1voronoicell__base.html#a1d86762311d8860960a45cc409b14f0f">cycle_up</a>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][nu[i]+j],k);
<a name="l01847"></a>01847                         <span class="keywordflow">do</span> {
<a name="l01848"></a>01848                                 v.push_back(k);
<a name="l01849"></a>01849                                 m=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l];
<a name="l01850"></a>01850                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l]=-1-m;
<a name="l01851"></a>01851                                 l=<a class="code" href="classvoro_1_1voronoicell__base.html#a1d86762311d8860960a45cc409b14f0f">cycle_up</a>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][nu[k]+l],m);
<a name="l01852"></a>01852                                 k=m;
<a name="l01853"></a>01853                         } <span class="keywordflow">while</span> (k!=i);
<a name="l01854"></a>01854                         vn=v.size();
<a name="l01855"></a>01855                         v[vp]=vn-vp-1;
<a name="l01856"></a>01856                         vp=vn;
<a name="l01857"></a>01857                 }
<a name="l01858"></a>01858         }
<a name="l01859"></a>01859         <a class="code" href="classvoro_1_1voronoicell__base.html#a5d09c9e36ad159fcd23cfef8855cae61">reset_edges</a>();
<a name="l01860"></a>01860 }
<a name="l01861"></a>01861 <span class="comment"></span>
<a name="l01862"></a>01862 <span class="comment">/** Outputs a list of the number of edges in each face.</span>
<a name="l01863"></a>01863 <span class="comment"> * \param[out] v the vector to store the results in. */</span>
<a name="l01864"></a><a class="code" href="classvoro_1_1voronoicell__base.html#a063f2915b13c389e36f8eaf462b0f277">01864</a> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__base.html#a063f2915b13c389e36f8eaf462b0f277">voronoicell_base::face_orders</a>(vector&lt;int&gt; &amp;v) {
<a name="l01865"></a>01865         <span class="keywordtype">int</span> i,j,k,l,m,q;
<a name="l01866"></a>01866         v.clear();
<a name="l01867"></a>01867         <span class="keywordflow">for</span>(i=1;i&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;i++) <span class="keywordflow">for</span>(j=0;j&lt;nu[i];j++) {
<a name="l01868"></a>01868                 k=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j];
<a name="l01869"></a>01869                 <span class="keywordflow">if</span>(k&gt;=0) {
<a name="l01870"></a>01870                         q=1;
<a name="l01871"></a>01871                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j]=-1-k;
<a name="l01872"></a>01872                         l=<a class="code" href="classvoro_1_1voronoicell__base.html#a1d86762311d8860960a45cc409b14f0f">cycle_up</a>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][nu[i]+j],k);
<a name="l01873"></a>01873                         <span class="keywordflow">do</span> {
<a name="l01874"></a>01874                                 q++;
<a name="l01875"></a>01875                                 m=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l];
<a name="l01876"></a>01876                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l]=-1-m;
<a name="l01877"></a>01877                                 l=<a class="code" href="classvoro_1_1voronoicell__base.html#a1d86762311d8860960a45cc409b14f0f">cycle_up</a>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][nu[k]+l],m);
<a name="l01878"></a>01878                                 k=m;
<a name="l01879"></a>01879                         } <span class="keywordflow">while</span> (k!=i);
<a name="l01880"></a>01880                         v.push_back(q);;
<a name="l01881"></a>01881                 }
<a name="l01882"></a>01882         }
<a name="l01883"></a>01883         <a class="code" href="classvoro_1_1voronoicell__base.html#a5d09c9e36ad159fcd23cfef8855cae61">reset_edges</a>();
<a name="l01884"></a>01884 }
<a name="l01885"></a>01885 <span class="comment"></span>
<a name="l01886"></a>01886 <span class="comment">/** Computes the number of edges that each face has and outputs a frequency</span>
<a name="l01887"></a>01887 <span class="comment"> * table of the results.</span>
<a name="l01888"></a>01888 <span class="comment"> * \param[out] v the vector to store the results in. */</span>
<a name="l01889"></a><a class="code" href="classvoro_1_1voronoicell__base.html#aef9b1ec41af3f118ce1da310f85c043b">01889</a> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__base.html#aef9b1ec41af3f118ce1da310f85c043b">voronoicell_base::face_freq_table</a>(vector&lt;int&gt; &amp;v) {
<a name="l01890"></a>01890         <span class="keywordtype">int</span> i,j,k,l,m,q;
<a name="l01891"></a>01891         v.clear();
<a name="l01892"></a>01892         <span class="keywordflow">for</span>(i=1;i&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;i++) <span class="keywordflow">for</span>(j=0;j&lt;nu[i];j++) {
<a name="l01893"></a>01893                 k=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j];
<a name="l01894"></a>01894                 <span class="keywordflow">if</span>(k&gt;=0) {
<a name="l01895"></a>01895                         q=1;
<a name="l01896"></a>01896                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j]=-1-k;
<a name="l01897"></a>01897                         l=<a class="code" href="classvoro_1_1voronoicell__base.html#a1d86762311d8860960a45cc409b14f0f">cycle_up</a>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][nu[i]+j],k);
<a name="l01898"></a>01898                         <span class="keywordflow">do</span> {
<a name="l01899"></a>01899                                 q++;
<a name="l01900"></a>01900                                 m=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l];
<a name="l01901"></a>01901                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l]=-1-m;
<a name="l01902"></a>01902                                 l=<a class="code" href="classvoro_1_1voronoicell__base.html#a1d86762311d8860960a45cc409b14f0f">cycle_up</a>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][nu[k]+l],m);
<a name="l01903"></a>01903                                 k=m;
<a name="l01904"></a>01904                         } <span class="keywordflow">while</span> (k!=i);
<a name="l01905"></a>01905                         <span class="keywordflow">if</span>((<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>) q&gt;v.size()) v.resize(q+1,0);
<a name="l01906"></a>01906                         v[q]++;
<a name="l01907"></a>01907                 }
<a name="l01908"></a>01908         }
<a name="l01909"></a>01909         <a class="code" href="classvoro_1_1voronoicell__base.html#a5d09c9e36ad159fcd23cfef8855cae61">reset_edges</a>();
<a name="l01910"></a>01910 }
<a name="l01911"></a>01911 <span class="comment"></span>
<a name="l01912"></a>01912 <span class="comment">/** This routine tests to see whether the cell intersects a plane by starting</span>
<a name="l01913"></a>01913 <span class="comment"> * from the guess point up. If up intersects, then it immediately returns true.</span>
<a name="l01914"></a>01914 <span class="comment"> * Otherwise, it calls the plane_intersects_track() routine.</span>
<a name="l01915"></a>01915 <span class="comment"> * \param[in] (x,y,z) the normal vector to the plane.</span>
<a name="l01916"></a>01916 <span class="comment"> * \param[in] rsq the distance along this vector of the plane.</span>
<a name="l01917"></a>01917 <span class="comment"> * \return False if the plane does not intersect the plane, true if it does. */</span>
<a name="l01918"></a><a class="code" href="classvoro_1_1voronoicell__base.html#aa2af8698ba5f2eefc14300f2ea1f6601">01918</a> <span class="keywordtype">bool</span> <a class="code" href="classvoro_1_1voronoicell__base.html#aa2af8698ba5f2eefc14300f2ea1f6601">voronoicell_base::plane_intersects</a>(<span class="keywordtype">double</span> x,<span class="keywordtype">double</span> y,<span class="keywordtype">double</span> z,<span class="keywordtype">double</span> rsq) {
<a name="l01919"></a>01919         <span class="keywordtype">double</span> g=x*pts[3*<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>]+y*pts[3*up+1]+z*pts[3*up+2];
<a name="l01920"></a>01920         <span class="keywordflow">if</span>(g&lt;rsq) <span class="keywordflow">return</span> plane_intersects_track(x,y,z,rsq,g);
<a name="l01921"></a>01921         <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l01922"></a>01922 }
<a name="l01923"></a>01923 <span class="comment"></span>
<a name="l01924"></a>01924 <span class="comment">/** This routine tests to see if a cell intersects a plane. It first tests a</span>
<a name="l01925"></a>01925 <span class="comment"> * random sample of approximately sqrt(p)/4 points. If any of those are</span>
<a name="l01926"></a>01926 <span class="comment"> * intersect, then it immediately returns true. Otherwise, it takes the closest</span>
<a name="l01927"></a>01927 <span class="comment"> * point and passes that to plane_intersect_track() routine.</span>
<a name="l01928"></a>01928 <span class="comment"> * \param[in] (x,y,z) the normal vector to the plane.</span>
<a name="l01929"></a>01929 <span class="comment"> * \param[in] rsq the distance along this vector of the plane.</span>
<a name="l01930"></a>01930 <span class="comment"> * \return False if the plane does not intersect the plane, true if it does. */</span>
<a name="l01931"></a><a class="code" href="classvoro_1_1voronoicell__base.html#a7ae7bf3f6bc1869d40e62a9d46b14b46">01931</a> <span class="keywordtype">bool</span> <a class="code" href="classvoro_1_1voronoicell__base.html#a7ae7bf3f6bc1869d40e62a9d46b14b46">voronoicell_base::plane_intersects_guess</a>(<span class="keywordtype">double</span> x,<span class="keywordtype">double</span> y,<span class="keywordtype">double</span> z,<span class="keywordtype">double</span> rsq) {
<a name="l01932"></a>01932         up=0;
<a name="l01933"></a>01933         <span class="keywordtype">double</span> g=x*pts[3*<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>]+y*pts[3*up+1]+z*pts[3*up+2];
<a name="l01934"></a>01934         <span class="keywordflow">if</span>(g&lt;rsq) {
<a name="l01935"></a>01935                 <span class="keywordtype">int</span> ca=1,cc=<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>&gt;&gt;3,mp=1;
<a name="l01936"></a>01936                 <span class="keywordtype">double</span> m;
<a name="l01937"></a>01937                 <span class="keywordflow">while</span>(ca&lt;cc) {
<a name="l01938"></a>01938                         m=x*pts[3*mp]+y*pts[3*mp+1]+z*pts[3*mp+2];
<a name="l01939"></a>01939                         <span class="keywordflow">if</span>(m&gt;g) {
<a name="l01940"></a>01940                                 <span class="keywordflow">if</span>(m&gt;rsq) <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l01941"></a>01941                                 g=m;up=mp;
<a name="l01942"></a>01942                         }
<a name="l01943"></a>01943                         ca+=mp++;
<a name="l01944"></a>01944                 }
<a name="l01945"></a>01945                 <span class="keywordflow">return</span> plane_intersects_track(x,y,z,rsq,g);
<a name="l01946"></a>01946         }
<a name="l01947"></a>01947         <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l01948"></a>01948 }
<a name="l01949"></a>01949 
<a name="l01950"></a>01950 <span class="comment">/* This routine tests to see if a cell intersects a plane, by tracing over the cell from</span>
<a name="l01951"></a>01951 <span class="comment"> * vertex to vertex, starting at up. It is meant to be called either by plane_intersects()</span>
<a name="l01952"></a>01952 <span class="comment"> * or plane_intersects_track(), when those routines cannot immediately resolve the case.</span>
<a name="l01953"></a>01953 <span class="comment"> * \param[in] (x,y,z) the normal vector to the plane.</span>
<a name="l01954"></a>01954 <span class="comment"> * \param[in] rsq the distance along this vector of the plane.</span>
<a name="l01955"></a>01955 <span class="comment"> * \param[in] g the distance of up from the plane.</span>
<a name="l01956"></a>01956 <span class="comment"> * \return False if the plane does not intersect the plane, true if it does. */</span>
<a name="l01957"></a>01957 <span class="keyword">inline</span> <span class="keywordtype">bool</span> voronoicell_base::plane_intersects_track(<span class="keywordtype">double</span> x,<span class="keywordtype">double</span> y,<span class="keywordtype">double</span> z,<span class="keywordtype">double</span> rsq,<span class="keywordtype">double</span> g) {
<a name="l01958"></a>01958         <span class="keywordtype">int</span> count=0,ls,us,tp;
<a name="l01959"></a>01959         <span class="keywordtype">double</span> t;
<a name="l01960"></a>01960 
<a name="l01961"></a>01961         <span class="comment">// The test point is outside of the cutting space</span>
<a name="l01962"></a>01962         <span class="keywordflow">for</span>(us=0;us&lt;nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>];us++) {
<a name="l01963"></a>01963                 tp=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][us];
<a name="l01964"></a>01964                 t=x*pts[3*tp]+y*pts[3*tp+1]+z*pts[3*tp+2];
<a name="l01965"></a>01965                 <span class="keywordflow">if</span>(t&gt;g) {
<a name="l01966"></a>01966                         ls=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>]+us];
<a name="l01967"></a>01967                         up=tp;
<a name="l01968"></a>01968                         <span class="keywordflow">while</span> (t&lt;rsq) {
<a name="l01969"></a>01969                                 <span class="keywordflow">if</span>(++count&gt;=<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>) {
<a name="l01970"></a>01970 <span class="preprocessor">#if VOROPP_VERBOSE &gt;=1</span>
<a name="l01971"></a>01971 <span class="preprocessor"></span>                                        fputs(<span class="stringliteral">&quot;Bailed out of convex calculation&quot;</span>,stderr);
<a name="l01972"></a>01972 <span class="preprocessor">#endif</span>
<a name="l01973"></a>01973 <span class="preprocessor"></span>                                        <span class="keywordflow">for</span>(tp=0;tp&lt;p;tp++) if(x*pts[3*tp]+y*pts[3*tp+1]+z*pts[3*tp+2]&gt;rsq) <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l01974"></a>01974                                         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l01975"></a>01975                                 }
<a name="l01976"></a>01976 
<a name="l01977"></a>01977                                 <span class="comment">// Test all the neighbors of the current point</span>
<a name="l01978"></a>01978                                 <span class="comment">// and find the one which is closest to the</span>
<a name="l01979"></a>01979                                 <span class="comment">// plane</span>
<a name="l01980"></a>01980                                 <span class="keywordflow">for</span>(us=0;us&lt;ls;us++) {
<a name="l01981"></a>01981                                         tp=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][us];
<a name="l01982"></a>01982                                         g=x*pts[3*tp]+y*pts[3*tp+1]+z*pts[3*tp+2];
<a name="l01983"></a>01983                                         <span class="keywordflow">if</span>(g&gt;t) <span class="keywordflow">break</span>;
<a name="l01984"></a>01984                                 }
<a name="l01985"></a>01985                                 <span class="keywordflow">if</span>(us==ls) {
<a name="l01986"></a>01986                                         us++;
<a name="l01987"></a>01987                                         <span class="keywordflow">while</span>(us&lt;nu[up]) {
<a name="l01988"></a>01988                                                 tp=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][us];
<a name="l01989"></a>01989                                                 g=x*pts[3*tp]+y*pts[3*tp+1]+z*pts[3*tp+2];
<a name="l01990"></a>01990                                                 <span class="keywordflow">if</span>(g&gt;t) <span class="keywordflow">break</span>;
<a name="l01991"></a>01991                                                 us++;
<a name="l01992"></a>01992                                         }
<a name="l01993"></a>01993                                         <span class="keywordflow">if</span>(us==nu[up]) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l01994"></a>01994                                 }
<a name="l01995"></a>01995                                 ls=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>][nu[<a class="code" href="classvoro_1_1voronoicell__base.html#a7746d94ae036439d60c3e4a9e37f6d15">up</a>]+us];up=tp;t=g;
<a name="l01996"></a>01996                         }
<a name="l01997"></a>01997                         <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l01998"></a>01998                 }
<a name="l01999"></a>01999         }
<a name="l02000"></a>02000         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l02001"></a>02001 }
<a name="l02002"></a>02002 <span class="comment"></span>
<a name="l02003"></a>02003 <span class="comment">/** Counts the number of edges of the Voronoi cell.</span>
<a name="l02004"></a>02004 <span class="comment"> * \return the number of edges. */</span>
<a name="l02005"></a><a class="code" href="classvoro_1_1voronoicell__base.html#a5dbd3cd4e9e9a41744e1a2a4c8f550c0">02005</a> <span class="keywordtype">int</span> <a class="code" href="classvoro_1_1voronoicell__base.html#a5dbd3cd4e9e9a41744e1a2a4c8f550c0">voronoicell_base::number_of_edges</a>() {
<a name="l02006"></a>02006         <span class="keywordtype">int</span> edges=0,*nup=<a class="code" href="classvoro_1_1voronoicell__base.html#abc7ec6777725e0ddffbbe2ecbe81c6a1">nu</a>;
<a name="l02007"></a>02007         <span class="keywordflow">while</span>(nup&lt;nu+<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>) edges+=*(nup++);
<a name="l02008"></a>02008         <span class="keywordflow">return</span> edges&gt;&gt;1;
<a name="l02009"></a>02009 }
<a name="l02010"></a>02010 <span class="comment"></span>
<a name="l02011"></a>02011 <span class="comment">/** Outputs a custom string of information about the Voronoi cell. The string</span>
<a name="l02012"></a>02012 <span class="comment"> * of information follows a similar style as the C printf command, and detailed</span>
<a name="l02013"></a>02013 <span class="comment"> * information about its format is available at</span>
<a name="l02014"></a>02014 <span class="comment"> * http://math.lbl.gov/voro++/doc/custom.html.</span>
<a name="l02015"></a>02015 <span class="comment"> * \param[in] format the custom string to print.</span>
<a name="l02016"></a>02016 <span class="comment"> * \param[in] i the ID of the particle associated with this Voronoi cell.</span>
<a name="l02017"></a>02017 <span class="comment"> * \param[in] (x,y,z) the position of the particle associated with this Voronoi</span>
<a name="l02018"></a>02018 <span class="comment"> *                    cell.</span>
<a name="l02019"></a>02019 <span class="comment"> * \param[in] r a radius associated with the particle.</span>
<a name="l02020"></a>02020 <span class="comment"> * \param[in] fp the file handle to write to. */</span>
<a name="l02021"></a><a class="code" href="classvoro_1_1voronoicell__base.html#ab6b8ff237f7b3e318c3756cd38586ec4">02021</a> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__base.html#a095c6bfc1b9b7a087d0b35b443e5c023">voronoicell_base::output_custom</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *format,<span class="keywordtype">int</span> i,<span class="keywordtype">double</span> x,<span class="keywordtype">double</span> y,<span class="keywordtype">double</span> z,<span class="keywordtype">double</span> r,FILE *fp) {
<a name="l02022"></a>02022         <span class="keywordtype">char</span> *fmp=(<span class="keyword">const_cast&lt;</span><span class="keywordtype">char</span>*<span class="keyword">&gt;</span>(format));
<a name="l02023"></a>02023         vector&lt;int&gt; vi;
<a name="l02024"></a>02024         vector&lt;double&gt; vd;
<a name="l02025"></a>02025         <span class="keywordflow">while</span>(*fmp!=0) {
<a name="l02026"></a>02026                 <span class="keywordflow">if</span>(*fmp==<span class="charliteral">&#39;%&#39;</span>) {
<a name="l02027"></a>02027                         fmp++;
<a name="l02028"></a>02028                         <span class="keywordflow">switch</span>(*fmp) {
<a name="l02029"></a>02029 
<a name="l02030"></a>02030                                 <span class="comment">// Particle-related output</span>
<a name="l02031"></a>02031                                 <span class="keywordflow">case</span> <span class="charliteral">&#39;i&#39;</span>: fprintf(fp,<span class="stringliteral">&quot;%d&quot;</span>,i);<span class="keywordflow">break</span>;
<a name="l02032"></a>02032                                 <span class="keywordflow">case</span> <span class="charliteral">&#39;x&#39;</span>: fprintf(fp,<span class="stringliteral">&quot;%g&quot;</span>,x);<span class="keywordflow">break</span>;
<a name="l02033"></a>02033                                 <span class="keywordflow">case</span> <span class="charliteral">&#39;y&#39;</span>: fprintf(fp,<span class="stringliteral">&quot;%g&quot;</span>,y);<span class="keywordflow">break</span>;
<a name="l02034"></a>02034                                 <span class="keywordflow">case</span> <span class="charliteral">&#39;z&#39;</span>: fprintf(fp,<span class="stringliteral">&quot;%g&quot;</span>,z);<span class="keywordflow">break</span>;
<a name="l02035"></a>02035                                 <span class="keywordflow">case</span> <span class="charliteral">&#39;q&#39;</span>: fprintf(fp,<span class="stringliteral">&quot;%g %g %g&quot;</span>,x,y,z);<span class="keywordflow">break</span>;
<a name="l02036"></a>02036                                 <span class="keywordflow">case</span> <span class="charliteral">&#39;r&#39;</span>: fprintf(fp,<span class="stringliteral">&quot;%g&quot;</span>,r);<span class="keywordflow">break</span>;
<a name="l02037"></a>02037 
<a name="l02038"></a>02038                                 <span class="comment">// Vertex-related output</span>
<a name="l02039"></a>02039                                 <span class="keywordflow">case</span> <span class="charliteral">&#39;w&#39;</span>: fprintf(fp,<span class="stringliteral">&quot;%d&quot;</span>,<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>);<span class="keywordflow">break</span>;
<a name="l02040"></a>02040                                 <span class="keywordflow">case</span> <span class="charliteral">&#39;p&#39;</span>: <a class="code" href="classvoro_1_1voronoicell__base.html#aee879731b1f4feb9f630d9b7f9c0062f">output_vertices</a>(fp);<span class="keywordflow">break</span>;
<a name="l02041"></a>02041                                 <span class="keywordflow">case</span> <span class="charliteral">&#39;P&#39;</span>: <a class="code" href="classvoro_1_1voronoicell__base.html#aee879731b1f4feb9f630d9b7f9c0062f">output_vertices</a>(x,y,z,fp);<span class="keywordflow">break</span>;
<a name="l02042"></a>02042                                 <span class="keywordflow">case</span> <span class="charliteral">&#39;o&#39;</span>: <a class="code" href="classvoro_1_1voronoicell__base.html#af92d19d0e7fc07006bcd8ea30c9df447">output_vertex_orders</a>(fp);<span class="keywordflow">break</span>;
<a name="l02043"></a>02043                                 <span class="keywordflow">case</span> <span class="charliteral">&#39;m&#39;</span>: fprintf(fp,<span class="stringliteral">&quot;%g&quot;</span>,0.25*<a class="code" href="classvoro_1_1voronoicell__base.html#a6a29a361a158db038a5c4c8e47322bd5">max_radius_squared</a>());<span class="keywordflow">break</span>;
<a name="l02044"></a>02044 
<a name="l02045"></a>02045                                 <span class="comment">// Edge-related output</span>
<a name="l02046"></a>02046                                 <span class="keywordflow">case</span> <span class="charliteral">&#39;g&#39;</span>: fprintf(fp,<span class="stringliteral">&quot;%d&quot;</span>,<a class="code" href="classvoro_1_1voronoicell__base.html#a5dbd3cd4e9e9a41744e1a2a4c8f550c0">number_of_edges</a>());<span class="keywordflow">break</span>;
<a name="l02047"></a>02047                                 <span class="keywordflow">case</span> <span class="charliteral">&#39;E&#39;</span>: fprintf(fp,<span class="stringliteral">&quot;%g&quot;</span>,<a class="code" href="classvoro_1_1voronoicell__base.html#a94fc0aba05c11fba465449bc1c4217e9">total_edge_distance</a>());<span class="keywordflow">break</span>;
<a name="l02048"></a>02048                                 <span class="keywordflow">case</span> <span class="charliteral">&#39;e&#39;</span>: <a class="code" href="classvoro_1_1voronoicell__base.html#aca984813e3a98a75d2e280fafca519da">face_perimeters</a>(vd);voro_print_vector(vd,fp);<span class="keywordflow">break</span>;
<a name="l02049"></a>02049 
<a name="l02050"></a>02050                                 <span class="comment">// Face-related output</span>
<a name="l02051"></a>02051                                 <span class="keywordflow">case</span> <span class="charliteral">&#39;s&#39;</span>: fprintf(fp,<span class="stringliteral">&quot;%d&quot;</span>,<a class="code" href="classvoro_1_1voronoicell__base.html#a56b835abe6d47cb67b206202125eb406">number_of_faces</a>());<span class="keywordflow">break</span>;
<a name="l02052"></a>02052                                 <span class="keywordflow">case</span> <span class="charliteral">&#39;F&#39;</span>: fprintf(fp,<span class="stringliteral">&quot;%g&quot;</span>,<a class="code" href="classvoro_1_1voronoicell__base.html#af1a68eea414a0a52b072005af7bd710a">surface_area</a>());<span class="keywordflow">break</span>;
<a name="l02053"></a>02053                                 <span class="keywordflow">case</span> <span class="charliteral">&#39;A&#39;</span>: {
<a name="l02054"></a>02054                                                   <a class="code" href="classvoro_1_1voronoicell__base.html#aef9b1ec41af3f118ce1da310f85c043b">face_freq_table</a>(vi);
<a name="l02055"></a>02055                                                   voro_print_vector(vi,fp);
<a name="l02056"></a>02056                                           } <span class="keywordflow">break</span>;
<a name="l02057"></a>02057                                 <span class="keywordflow">case</span> <span class="charliteral">&#39;a&#39;</span>: <a class="code" href="classvoro_1_1voronoicell__base.html#a063f2915b13c389e36f8eaf462b0f277">face_orders</a>(vi);voro_print_vector(vi,fp);<span class="keywordflow">break</span>;
<a name="l02058"></a>02058                                 <span class="keywordflow">case</span> <span class="charliteral">&#39;f&#39;</span>: <a class="code" href="classvoro_1_1voronoicell__base.html#a5e2628315bfb924f7013c3efee689d72">face_areas</a>(vd);voro_print_vector(vd,fp);<span class="keywordflow">break</span>;
<a name="l02059"></a>02059                                 <span class="keywordflow">case</span> <span class="charliteral">&#39;t&#39;</span>: {
<a name="l02060"></a>02060                                                   <a class="code" href="classvoro_1_1voronoicell__base.html#a955288d82dfe6c2d567b1cfb906aa419">face_vertices</a>(vi);
<a name="l02061"></a>02061                                                   voro_print_face_vertices(vi,fp);
<a name="l02062"></a>02062                                           } <span class="keywordflow">break</span>;
<a name="l02063"></a>02063                                 <span class="keywordflow">case</span> <span class="charliteral">&#39;l&#39;</span>: <a class="code" href="classvoro_1_1voronoicell__base.html#a203881f2c90c18ca4ffd7ac0d8b8a61c">normals</a>(vd);
<a name="l02064"></a>02064                                           voro_print_positions(vd,fp);
<a name="l02065"></a>02065                                           <span class="keywordflow">break</span>;
<a name="l02066"></a>02066                                 <span class="keywordflow">case</span> <span class="charliteral">&#39;n&#39;</span>: <a class="code" href="classvoro_1_1voronoicell__base.html#a5d52bea0312e95ed77b82aeca10824b1">neighbors</a>(vi);
<a name="l02067"></a>02067                                           voro_print_vector(vi,fp);
<a name="l02068"></a>02068                                           <span class="keywordflow">break</span>;
<a name="l02069"></a>02069 
<a name="l02070"></a>02070                                 <span class="comment">// Volume-related output</span>
<a name="l02071"></a>02071                                 <span class="keywordflow">case</span> <span class="charliteral">&#39;v&#39;</span>: fprintf(fp,<span class="stringliteral">&quot;%g&quot;</span>,<a class="code" href="classvoro_1_1voronoicell__base.html#a92f69986a6f78e7b8b6d9f5778ed99ba">volume</a>());<span class="keywordflow">break</span>;
<a name="l02072"></a>02072                                 <span class="keywordflow">case</span> <span class="charliteral">&#39;c&#39;</span>: {
<a name="l02073"></a>02073                                                   <span class="keywordtype">double</span> cx,cy,cz;
<a name="l02074"></a>02074                                                   <a class="code" href="classvoro_1_1voronoicell__base.html#a7ea57c92bba3110da745381c5877cec3">centroid</a>(cx,cy,cz);
<a name="l02075"></a>02075                                                   fprintf(fp,<span class="stringliteral">&quot;%g %g %g&quot;</span>,cx,cy,cz);
<a name="l02076"></a>02076                                           } <span class="keywordflow">break</span>;
<a name="l02077"></a>02077                                 <span class="keywordflow">case</span> <span class="charliteral">&#39;C&#39;</span>: {
<a name="l02078"></a>02078                                                   <span class="keywordtype">double</span> cx,cy,cz;
<a name="l02079"></a>02079                                                   <a class="code" href="classvoro_1_1voronoicell__base.html#a7ea57c92bba3110da745381c5877cec3">centroid</a>(cx,cy,cz);
<a name="l02080"></a>02080                                                   fprintf(fp,<span class="stringliteral">&quot;%g %g %g&quot;</span>,x+cx,y+cy,z+cz);
<a name="l02081"></a>02081                                           } <span class="keywordflow">break</span>;
<a name="l02082"></a>02082 
<a name="l02083"></a>02083                                 <span class="comment">// End-of-string reached</span>
<a name="l02084"></a>02084                                 <span class="keywordflow">case</span> 0: fmp--;<span class="keywordflow">break</span>;
<a name="l02085"></a>02085 
<a name="l02086"></a>02086                                 <span class="comment">// The percent sign is not part of a</span>
<a name="l02087"></a>02087                                 <span class="comment">// control sequence</span>
<a name="l02088"></a>02088                                 <span class="keywordflow">default</span>: putc(<span class="charliteral">&#39;%&#39;</span>,fp);putc(*fmp,fp);
<a name="l02089"></a>02089                         }
<a name="l02090"></a>02090                 } <span class="keywordflow">else</span> putc(*fmp,fp);
<a name="l02091"></a>02091                 fmp++;
<a name="l02092"></a>02092         }
<a name="l02093"></a>02093         fputs(<span class="stringliteral">&quot;\n&quot;</span>,fp);
<a name="l02094"></a>02094 }
<a name="l02095"></a>02095 <span class="comment"></span>
<a name="l02096"></a>02096 <span class="comment">/** This initializes the class to be a rectangular box. It calls the base class</span>
<a name="l02097"></a>02097 <span class="comment"> * initialization routine to set up the edge and vertex information, and then</span>
<a name="l02098"></a>02098 <span class="comment"> * sets up the neighbor information, with initial faces being assigned ID</span>
<a name="l02099"></a>02099 <span class="comment"> * numbers from -1 to -6.</span>
<a name="l02100"></a>02100 <span class="comment"> * \param[in] (xmin,xmax) the minimum and maximum x coordinates.</span>
<a name="l02101"></a>02101 <span class="comment"> * \param[in] (ymin,ymax) the minimum and maximum y coordinates.</span>
<a name="l02102"></a>02102 <span class="comment"> * \param[in] (zmin,zmax) the minimum and maximum z coordinates. */</span>
<a name="l02103"></a><a class="code" href="classvoro_1_1voronoicell__neighbor.html#ac20bf4f827fd1fc20c1596a8cec95fa3">02103</a> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__neighbor.html#ac20bf4f827fd1fc20c1596a8cec95fa3">voronoicell_neighbor::init</a>(<span class="keywordtype">double</span> xmin,<span class="keywordtype">double</span> xmax,<span class="keywordtype">double</span> ymin,<span class="keywordtype">double</span> ymax,<span class="keywordtype">double</span> zmin,<span class="keywordtype">double</span> zmax) {
<a name="l02104"></a>02104         <a class="code" href="classvoro_1_1voronoicell__base.html#a4c7f5406ba3beb1aa0d047592316c68d">init_base</a>(xmin,xmax,ymin,ymax,zmin,zmax);
<a name="l02105"></a>02105         <span class="keywordtype">int</span> *q=<a class="code" href="classvoro_1_1voronoicell__neighbor.html#aaa1c991b6f5af826bac0f4c7d5f6bf5c">mne</a>[3];
<a name="l02106"></a>02106         *q=-5;q[1]=-3;q[2]=-1;
<a name="l02107"></a>02107         q[3]=-5;q[4]=-2;q[5]=-3;
<a name="l02108"></a>02108         q[6]=-5;q[7]=-1;q[8]=-4;
<a name="l02109"></a>02109         q[9]=-5;q[10]=-4;q[11]=-2;
<a name="l02110"></a>02110         q[12]=-6;q[13]=-1;q[14]=-3;
<a name="l02111"></a>02111         q[15]=-6;q[16]=-3;q[17]=-2;
<a name="l02112"></a>02112         q[18]=-6;q[19]=-4;q[20]=-1;
<a name="l02113"></a>02113         q[21]=-6;q[22]=-2;q[23]=-4;
<a name="l02114"></a>02114         *<a class="code" href="classvoro_1_1voronoicell__neighbor.html#a7c061d08eac012b23588032779603a19">ne</a>=q;<a class="code" href="classvoro_1_1voronoicell__neighbor.html#a7c061d08eac012b23588032779603a19">ne</a>[1]=q+3;<a class="code" href="classvoro_1_1voronoicell__neighbor.html#a7c061d08eac012b23588032779603a19">ne</a>[2]=q+6;<a class="code" href="classvoro_1_1voronoicell__neighbor.html#a7c061d08eac012b23588032779603a19">ne</a>[3]=q+9;
<a name="l02115"></a>02115         <a class="code" href="classvoro_1_1voronoicell__neighbor.html#a7c061d08eac012b23588032779603a19">ne</a>[4]=q+12;<a class="code" href="classvoro_1_1voronoicell__neighbor.html#a7c061d08eac012b23588032779603a19">ne</a>[5]=q+15;<a class="code" href="classvoro_1_1voronoicell__neighbor.html#a7c061d08eac012b23588032779603a19">ne</a>[6]=q+18;<a class="code" href="classvoro_1_1voronoicell__neighbor.html#a7c061d08eac012b23588032779603a19">ne</a>[7]=q+21;
<a name="l02116"></a>02116 }
<a name="l02117"></a>02117 <span class="comment"></span>
<a name="l02118"></a>02118 <span class="comment">/** This initializes the class to be an octahedron. It calls the base class</span>
<a name="l02119"></a>02119 <span class="comment"> * initialization routine to set up the edge and vertex information, and then</span>
<a name="l02120"></a>02120 <span class="comment"> * sets up the neighbor information, with the initial faces being assigned ID</span>
<a name="l02121"></a>02121 <span class="comment"> * numbers from -1 to -8.</span>
<a name="l02122"></a>02122 <span class="comment"> * \param[in] l The distance from the octahedron center to a vertex. Six</span>
<a name="l02123"></a>02123 <span class="comment"> *              vertices are initialized at (-l,0,0), (l,0,0), (0,-l,0),</span>
<a name="l02124"></a>02124 <span class="comment"> *              (0,l,0), (0,0,-l), and (0,0,l). */</span>
<a name="l02125"></a><a class="code" href="classvoro_1_1voronoicell__neighbor.html#a3648ccb2b3bdf7832779ea7d311d129c">02125</a> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__neighbor.html#a3648ccb2b3bdf7832779ea7d311d129c">voronoicell_neighbor::init_octahedron</a>(<span class="keywordtype">double</span> l) {
<a name="l02126"></a>02126         <a class="code" href="classvoro_1_1voronoicell__base.html#aab954caa57c67a26c03b0377f5778bb1">init_octahedron_base</a>(l);
<a name="l02127"></a>02127         <span class="keywordtype">int</span> *q=<a class="code" href="classvoro_1_1voronoicell__neighbor.html#aaa1c991b6f5af826bac0f4c7d5f6bf5c">mne</a>[4];
<a name="l02128"></a>02128         *q=-5;q[1]=-6;q[2]=-7;q[3]=-8;
<a name="l02129"></a>02129         q[4]=-1;q[5]=-2;q[6]=-3;q[7]=-4;
<a name="l02130"></a>02130         q[8]=-6;q[9]=-5;q[10]=-2;q[11]=-1;
<a name="l02131"></a>02131         q[12]=-8;q[13]=-7;q[14]=-4;q[15]=-3;
<a name="l02132"></a>02132         q[16]=-5;q[17]=-8;q[18]=-3;q[19]=-2;
<a name="l02133"></a>02133         q[20]=-7;q[21]=-6;q[22]=-1;q[23]=-4;
<a name="l02134"></a>02134         *<a class="code" href="classvoro_1_1voronoicell__neighbor.html#a7c061d08eac012b23588032779603a19">ne</a>=q;<a class="code" href="classvoro_1_1voronoicell__neighbor.html#a7c061d08eac012b23588032779603a19">ne</a>[1]=q+4;<a class="code" href="classvoro_1_1voronoicell__neighbor.html#a7c061d08eac012b23588032779603a19">ne</a>[2]=q+8;<a class="code" href="classvoro_1_1voronoicell__neighbor.html#a7c061d08eac012b23588032779603a19">ne</a>[3]=q+12;<a class="code" href="classvoro_1_1voronoicell__neighbor.html#a7c061d08eac012b23588032779603a19">ne</a>[4]=q+16;<a class="code" href="classvoro_1_1voronoicell__neighbor.html#a7c061d08eac012b23588032779603a19">ne</a>[5]=q+20;
<a name="l02135"></a>02135 }
<a name="l02136"></a>02136 <span class="comment"></span>
<a name="l02137"></a>02137 <span class="comment">/** This initializes the class to be a tetrahedron. It calls the base class</span>
<a name="l02138"></a>02138 <span class="comment"> * initialization routine to set up the edge and vertex information, and then</span>
<a name="l02139"></a>02139 <span class="comment"> * sets up the neighbor information, with the initial faces being assigned ID</span>
<a name="l02140"></a>02140 <span class="comment"> * numbers from -1 to -4.</span>
<a name="l02141"></a>02141 <span class="comment"> * \param (x0,y0,z0) a position vector for the first vertex.</span>
<a name="l02142"></a>02142 <span class="comment"> * \param (x1,y1,z1) a position vector for the second vertex.</span>
<a name="l02143"></a>02143 <span class="comment"> * \param (x2,y2,z2) a position vector for the third vertex.</span>
<a name="l02144"></a>02144 <span class="comment"> * \param (x3,y3,z3) a position vector for the fourth vertex. */</span>
<a name="l02145"></a><a class="code" href="classvoro_1_1voronoicell__neighbor.html#a71f908538fa59e4a1ab1d44834f1f3f9">02145</a> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__neighbor.html#a71f908538fa59e4a1ab1d44834f1f3f9">voronoicell_neighbor::init_tetrahedron</a>(<span class="keywordtype">double</span> x0,<span class="keywordtype">double</span> y0,<span class="keywordtype">double</span> z0,<span class="keywordtype">double</span> x1,<span class="keywordtype">double</span> y1,<span class="keywordtype">double</span> z1,<span class="keywordtype">double</span> x2,<span class="keywordtype">double</span> y2,<span class="keywordtype">double</span> z2,<span class="keywordtype">double</span> x3,<span class="keywordtype">double</span> y3,<span class="keywordtype">double</span> z3) {
<a name="l02146"></a>02146         <a class="code" href="classvoro_1_1voronoicell__base.html#ae71280e1c36c5f840f870d55e91c027b">init_tetrahedron_base</a>(x0,y0,z0,x1,y1,z1,x2,y2,z2,x3,y3,z3);
<a name="l02147"></a>02147         <span class="keywordtype">int</span> *q=<a class="code" href="classvoro_1_1voronoicell__neighbor.html#aaa1c991b6f5af826bac0f4c7d5f6bf5c">mne</a>[3];
<a name="l02148"></a>02148         *q=-4;q[1]=-3;q[2]=-2;
<a name="l02149"></a>02149         q[3]=-3;q[4]=-4;q[5]=-1;
<a name="l02150"></a>02150         q[6]=-4;q[7]=-2;q[8]=-1;
<a name="l02151"></a>02151         q[9]=-2;q[10]=-3;q[11]=-1;
<a name="l02152"></a>02152         *<a class="code" href="classvoro_1_1voronoicell__neighbor.html#a7c061d08eac012b23588032779603a19">ne</a>=q;<a class="code" href="classvoro_1_1voronoicell__neighbor.html#a7c061d08eac012b23588032779603a19">ne</a>[1]=q+3;<a class="code" href="classvoro_1_1voronoicell__neighbor.html#a7c061d08eac012b23588032779603a19">ne</a>[2]=q+6;<a class="code" href="classvoro_1_1voronoicell__neighbor.html#a7c061d08eac012b23588032779603a19">ne</a>[3]=q+9;
<a name="l02153"></a>02153 }
<a name="l02154"></a>02154 <span class="comment"></span>
<a name="l02155"></a>02155 <span class="comment">/** This routine checks to make sure the neighbor information of each face is</span>
<a name="l02156"></a>02156 <span class="comment"> * consistent. */</span>
<a name="l02157"></a><a class="code" href="classvoro_1_1voronoicell__neighbor.html#aa3d80872ecb0dbccbc951082428c13c1">02157</a> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__neighbor.html#aa3d80872ecb0dbccbc951082428c13c1">voronoicell_neighbor::check_facets</a>() {
<a name="l02158"></a>02158         <span class="keywordtype">int</span> i,j,k,l,m,q;
<a name="l02159"></a>02159         <span class="keywordflow">for</span>(i=1;i&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;i++) <span class="keywordflow">for</span>(j=0;j&lt;nu[i];j++) {
<a name="l02160"></a>02160                 k=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j];
<a name="l02161"></a>02161                 <span class="keywordflow">if</span>(k&gt;=0) {
<a name="l02162"></a>02162                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j]=-1-k;
<a name="l02163"></a>02163                         q=<a class="code" href="classvoro_1_1voronoicell__neighbor.html#a7c061d08eac012b23588032779603a19">ne</a>[i][j];
<a name="l02164"></a>02164                         l=<a class="code" href="classvoro_1_1voronoicell__base.html#a1d86762311d8860960a45cc409b14f0f">cycle_up</a>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][nu[i]+j],k);
<a name="l02165"></a>02165                         <span class="keywordflow">do</span> {
<a name="l02166"></a>02166                                 m=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l];
<a name="l02167"></a>02167                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l]=-1-m;
<a name="l02168"></a>02168                                 fprintf(stderr,<span class="stringliteral">&quot;Facet error at (%d,%d)=%d, started from (%d,%d)=%d\n&quot;</span>,k,l,<a class="code" href="classvoro_1_1voronoicell__neighbor.html#a7c061d08eac012b23588032779603a19">ne</a>[k][l],i,j,q);
<a name="l02169"></a>02169                                 l=<a class="code" href="classvoro_1_1voronoicell__base.html#a1d86762311d8860960a45cc409b14f0f">cycle_up</a>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][nu[k]+l],m);
<a name="l02170"></a>02170                                 k=m;
<a name="l02171"></a>02171                         } <span class="keywordflow">while</span> (k!=i);
<a name="l02172"></a>02172                 }
<a name="l02173"></a>02173         }
<a name="l02174"></a>02174         <a class="code" href="classvoro_1_1voronoicell__base.html#a5d09c9e36ad159fcd23cfef8855cae61">reset_edges</a>();
<a name="l02175"></a>02175 }
<a name="l02176"></a>02176 <span class="comment"></span>
<a name="l02177"></a>02177 <span class="comment">/** The class constructor allocates memory for storing neighbor information. */</span>
<a name="l02178"></a><a class="code" href="classvoro_1_1voronoicell__neighbor.html#a4fdf7a7b46bb5b8e6c9613308ad399c0">02178</a> <a class="code" href="classvoro_1_1voronoicell__neighbor.html#a4fdf7a7b46bb5b8e6c9613308ad399c0">voronoicell_neighbor::voronoicell_neighbor</a>() {
<a name="l02179"></a>02179         <span class="keywordtype">int</span> i;
<a name="l02180"></a>02180         <a class="code" href="classvoro_1_1voronoicell__neighbor.html#aaa1c991b6f5af826bac0f4c7d5f6bf5c">mne</a>=<span class="keyword">new</span> <span class="keywordtype">int</span>*[<a class="code" href="classvoro_1_1voronoicell__base.html#a14c97918200da778388673728da29274">current_vertex_order</a>];
<a name="l02181"></a>02181         <a class="code" href="classvoro_1_1voronoicell__neighbor.html#a7c061d08eac012b23588032779603a19">ne</a>=<span class="keyword">new</span> <span class="keywordtype">int</span>*[<a class="code" href="classvoro_1_1voronoicell__base.html#ab0b624e4e72fca14c99bf1c41c430614">current_vertices</a>];
<a name="l02182"></a>02182         <span class="keywordflow">for</span>(i=0;i&lt;3;i++) <a class="code" href="classvoro_1_1voronoicell__neighbor.html#aaa1c991b6f5af826bac0f4c7d5f6bf5c">mne</a>[i]=<span class="keyword">new</span> <span class="keywordtype">int</span>[init_n_vertices*i];
<a name="l02183"></a>02183         <a class="code" href="classvoro_1_1voronoicell__neighbor.html#aaa1c991b6f5af826bac0f4c7d5f6bf5c">mne</a>[3]=<span class="keyword">new</span> <span class="keywordtype">int</span>[init_3_vertices*3];
<a name="l02184"></a>02184         <span class="keywordflow">for</span>(i=4;i&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a14c97918200da778388673728da29274">current_vertex_order</a>;i++) <a class="code" href="classvoro_1_1voronoicell__neighbor.html#aaa1c991b6f5af826bac0f4c7d5f6bf5c">mne</a>[i]=<span class="keyword">new</span> <span class="keywordtype">int</span>[init_n_vertices*i];
<a name="l02185"></a>02185 }
<a name="l02186"></a>02186 <span class="comment"></span>
<a name="l02187"></a>02187 <span class="comment">/** The class destructor frees the dynamically allocated memory for storing</span>
<a name="l02188"></a>02188 <span class="comment"> * neighbor information. */</span>
<a name="l02189"></a><a class="code" href="classvoro_1_1voronoicell__neighbor.html#a196e44ab9b3caf7d5862fa47ee3341fe">02189</a> <a class="code" href="classvoro_1_1voronoicell__neighbor.html#a196e44ab9b3caf7d5862fa47ee3341fe">voronoicell_neighbor::~voronoicell_neighbor</a>() {
<a name="l02190"></a>02190         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=current_vertex_order-1;i&gt;=0;i--) <span class="keywordflow">if</span>(mem[i]&gt;0) <span class="keyword">delete</span> [] <a class="code" href="classvoro_1_1voronoicell__neighbor.html#aaa1c991b6f5af826bac0f4c7d5f6bf5c">mne</a>[i];
<a name="l02191"></a>02191         <span class="keyword">delete</span> [] <a class="code" href="classvoro_1_1voronoicell__neighbor.html#aaa1c991b6f5af826bac0f4c7d5f6bf5c">mne</a>;
<a name="l02192"></a>02192         <span class="keyword">delete</span> [] <a class="code" href="classvoro_1_1voronoicell__neighbor.html#a7c061d08eac012b23588032779603a19">ne</a>;
<a name="l02193"></a>02193 }
<a name="l02194"></a>02194 <span class="comment"></span>
<a name="l02195"></a>02195 <span class="comment">/** Computes a vector list of neighbors. */</span>
<a name="l02196"></a><a class="code" href="classvoro_1_1voronoicell__neighbor.html#a1583bda821b719b59a49a5a31d708497">02196</a> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__neighbor.html#a1583bda821b719b59a49a5a31d708497">voronoicell_neighbor::neighbors</a>(vector&lt;int&gt; &amp;v) {
<a name="l02197"></a>02197         v.clear();
<a name="l02198"></a>02198         <span class="keywordtype">int</span> i,j,k,l,m;
<a name="l02199"></a>02199         <span class="keywordflow">for</span>(i=1;i&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;i++) <span class="keywordflow">for</span>(j=0;j&lt;nu[i];j++) {
<a name="l02200"></a>02200                 k=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j];
<a name="l02201"></a>02201                 <span class="keywordflow">if</span>(k&gt;=0) {
<a name="l02202"></a>02202                         v.push_back(<a class="code" href="classvoro_1_1voronoicell__neighbor.html#a7c061d08eac012b23588032779603a19">ne</a>[i][j]);
<a name="l02203"></a>02203                         <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j]=-1-k;
<a name="l02204"></a>02204                         l=<a class="code" href="classvoro_1_1voronoicell__base.html#a1d86762311d8860960a45cc409b14f0f">cycle_up</a>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][nu[i]+j],k);
<a name="l02205"></a>02205                         <span class="keywordflow">do</span> {
<a name="l02206"></a>02206                                 m=<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l];
<a name="l02207"></a>02207                                 <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][l]=-1-m;
<a name="l02208"></a>02208                                 l=<a class="code" href="classvoro_1_1voronoicell__base.html#a1d86762311d8860960a45cc409b14f0f">cycle_up</a>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[k][nu[k]+l],m);
<a name="l02209"></a>02209                                 k=m;
<a name="l02210"></a>02210                         } <span class="keywordflow">while</span> (k!=i);
<a name="l02211"></a>02211                 }
<a name="l02212"></a>02212         }
<a name="l02213"></a>02213         <a class="code" href="classvoro_1_1voronoicell__base.html#a5d09c9e36ad159fcd23cfef8855cae61">reset_edges</a>();
<a name="l02214"></a>02214 }
<a name="l02215"></a>02215 <span class="comment"></span>
<a name="l02216"></a>02216 <span class="comment">/** Prints the vertices, their edges, the relation table, and also notifies if</span>
<a name="l02217"></a>02217 <span class="comment"> * any memory errors are visible. */</span>
<a name="l02218"></a><a class="code" href="classvoro_1_1voronoicell__base.html#a8a7e29d041abbd58406e2c05a9a6248a">02218</a> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__base.html#a8a7e29d041abbd58406e2c05a9a6248a">voronoicell_base::print_edges</a>() {
<a name="l02219"></a>02219         <span class="keywordtype">int</span> j;
<a name="l02220"></a>02220         <span class="keywordtype">double</span> *ptsp=<a class="code" href="classvoro_1_1voronoicell__base.html#aa4e3f22d4ff450097571e95caeda1b3d">pts</a>;
<a name="l02221"></a>02221         <span class="keywordflow">for</span>(<span class="keywordtype">int</span> i=0;i&lt;<a class="code" href="classvoro_1_1voronoicell__base.html#a7e69469f95464afbeb9feec927507243">p</a>;i++,ptsp+=3) {
<a name="l02222"></a>02222                 printf(<span class="stringliteral">&quot;%d %d  &quot;</span>,i,nu[i]);
<a name="l02223"></a>02223                 <span class="keywordflow">for</span>(j=0;j&lt;nu[i];j++) printf(<span class="stringliteral">&quot; %d&quot;</span>,<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j]);
<a name="l02224"></a>02224                 printf(<span class="stringliteral">&quot;  &quot;</span>);
<a name="l02225"></a>02225                 <span class="keywordflow">while</span>(j&lt;(nu[i]&lt;&lt;1)) printf(<span class="stringliteral">&quot; %d&quot;</span>,<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j]);
<a name="l02226"></a>02226                 printf(<span class="stringliteral">&quot;   %d&quot;</span>,<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i][j]);
<a name="l02227"></a>02227                 <a class="code" href="classvoro_1_1voronoicell__base.html#ac164b3767ce186360fb3308e349e058c">print_edges_neighbors</a>(i);
<a name="l02228"></a>02228                 printf(<span class="stringliteral">&quot;  %g %g %g %p&quot;</span>,*ptsp,ptsp[1],ptsp[2],(<span class="keywordtype">void</span>*) <a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i]);
<a name="l02229"></a>02229                 <span class="keywordflow">if</span>(<a class="code" href="classvoro_1_1voronoicell__base.html#a85fec05865342d7efca9d9fd11b60342">ed</a>[i]&gt;=<a class="code" href="classvoro_1_1voronoicell__base.html#a2b115cbde725e468000a1da234b2fc66">mep</a>[nu[i]]+<a class="code" href="classvoro_1_1voronoicell__base.html#accebb51f721d72fc6d460f1368180571">mec</a>[nu[i]]*((nu[i]&lt;&lt;1)+1)) puts(<span class="stringliteral">&quot; Memory error&quot;</span>);
<a name="l02230"></a>02230                 <span class="keywordflow">else</span> puts(<span class="stringliteral">&quot;&quot;</span>);
<a name="l02231"></a>02231         }
<a name="l02232"></a>02232 }
<a name="l02233"></a>02233 <span class="comment"></span>
<a name="l02234"></a>02234 <span class="comment">/** This prints out the neighbor information for vertex i. */</span>
<a name="l02235"></a><a class="code" href="classvoro_1_1voronoicell__neighbor.html#a868581daaec73455618629e668c92d38">02235</a> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__neighbor.html#a868581daaec73455618629e668c92d38">voronoicell_neighbor::print_edges_neighbors</a>(<span class="keywordtype">int</span> i) {
<a name="l02236"></a>02236         <span class="keywordflow">if</span>(nu[i]&gt;0) {
<a name="l02237"></a>02237                 <span class="keywordtype">int</span> j=0;
<a name="l02238"></a>02238                 printf(<span class="stringliteral">&quot;     (&quot;</span>);
<a name="l02239"></a>02239                 <span class="keywordflow">while</span>(j&lt;nu[i]-1) printf(<span class="stringliteral">&quot;%d,&quot;</span>,<a class="code" href="classvoro_1_1voronoicell__neighbor.html#a7c061d08eac012b23588032779603a19">ne</a>[i][j++]);
<a name="l02240"></a>02240                 printf(<span class="stringliteral">&quot;%d)&quot;</span>,<a class="code" href="classvoro_1_1voronoicell__neighbor.html#a7c061d08eac012b23588032779603a19">ne</a>[i][j]);
<a name="l02241"></a>02241         } <span class="keywordflow">else</span> printf(<span class="stringliteral">&quot;     ()&quot;</span>);
<a name="l02242"></a>02242 }
<a name="l02243"></a>02243 
<a name="l02244"></a>02244 <span class="comment">// Explicit instantiation</span>
<a name="l02245"></a>02245 <span class="keyword">template</span> <span class="keywordtype">bool</span> <a class="code" href="classvoro_1_1voronoicell__base.html#a079bc593542ae5d06a9a217212435466">voronoicell_base::nplane</a>(<a class="code" href="classvoro_1_1voronoicell.html" title="Extension of the voronoicell_base class to represent a Voronoi cell without neighbor information...">voronoicell</a>&amp;,<span class="keywordtype">double</span>,<span class="keywordtype">double</span>,<span class="keywordtype">double</span>,<span class="keywordtype">double</span>,<span class="keywordtype">int</span>);
<a name="l02246"></a>02246 <span class="keyword">template</span> <span class="keywordtype">bool</span> <a class="code" href="classvoro_1_1voronoicell__base.html#a079bc593542ae5d06a9a217212435466">voronoicell_base::nplane</a>(<a class="code" href="classvoro_1_1voronoicell__neighbor.html" title="Extension of the voronoicell_base class to represent a Voronoi cell with neighbor information...">voronoicell_neighbor</a>&amp;,<span class="keywordtype">double</span>,<span class="keywordtype">double</span>,<span class="keywordtype">double</span>,<span class="keywordtype">double</span>,<span class="keywordtype">int</span>);
<a name="l02247"></a>02247 <span class="keyword">template</span> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__base.html#af2c9d916f946ba8d9c7e4c0a7e65215b">voronoicell_base::check_memory_for_copy</a>(<a class="code" href="classvoro_1_1voronoicell.html" title="Extension of the voronoicell_base class to represent a Voronoi cell without neighbor information...">voronoicell</a>&amp;,<a class="code" href="classvoro_1_1voronoicell__base.html" title="A class representing a single Voronoi cell.">voronoicell_base</a>*);
<a name="l02248"></a>02248 <span class="keyword">template</span> <span class="keywordtype">void</span> <a class="code" href="classvoro_1_1voronoicell__base.html#af2c9d916f946ba8d9c7e4c0a7e65215b">voronoicell_base::check_memory_for_copy</a>(<a class="code" href="classvoro_1_1voronoicell__neighbor.html" title="Extension of the voronoicell_base class to represent a Voronoi cell with neighbor information...">voronoicell_neighbor</a>&amp;,<a class="code" href="classvoro_1_1voronoicell__base.html" title="A class representing a single Voronoi cell.">voronoicell_base</a>*);
<a name="l02249"></a>02249 
<a name="l02250"></a>02250 }
</pre></div></div>
</div>


<hr class="footer"/><address class="footer"><small>
Generated on Fri Sep 23 2011 22:49:06 for Voro++ by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.5.1
</small></address>

</body>
</html>
